2011-12-08 139 views
0

我正在审查我的所有代码,并且在验证用户输入前验证用户输入的必要性有第二个想法。举例来说,信用卡CVV的验证:验证之前验证是否需要验证?

// validation required? 
if(!preg_match('/^[\d]{3,4}$/', $_POST['card_CVV'])) 
{ 
unset($_POST['card_CVV']); 
$error++; 

// verification 
} 
elseif($card_CVV != $_POST['card_CVV']) 
{ 
$error++; 
} 

// pass verification 
else 
{ 
// process transaction 
} 

是否应该在未验证的情况下进行验证?

+0

嗯,我想即使在这里有注射可能。永远和总是验证和过滤用户输入 - 意味着你不应该在elseif中使用未经过滤的$ _POST'变量,对吗?! – Anonymous

+0

我不确定我完全理解验证和验证之间的区别。他们看起来事实上是同一件事情......您正在检查输入是否处于预期形式,通常是以相当简单的方式进行,通常是在对这些输入进行更严格的处理之前,向用户返回错误消息。 – cdeszaq

+0

@ Dan Surfrider,我不存储用户数据,是否仍然存在风险? –

回答

2

在这种特殊情况下,它不是必要的,实际上什么也不做,因为假设它是错误的格式,它永远不会是正确的。

在提交表单之前,在javascript中验证客户端的格式是更有意义的,也许是因为它们的类型是如果你想获得更多的花式,那么用户得到即时反馈并知道它是提交前错误。

此外,如果您将$_POST['card_CVV']的内容放入SQL查询或以HTML格式显示在某处,您应该了解注入的可能性。你说你没有把它存储起来,从显示的代码中它只用于直接字符串比较,所以我怀疑它应该没问题,但请在代码的其余部分注意这一点。

1

实时取决于您需要显示回给用户的上下文和/或错误消息。

例如,您需要对第一个输入进行上述验证,并且如果它不是有效的输入,则会将消息显示给用户。但是,如果您想检查用户是否输入了正确的card_CVV,则需要两个因为您的错误消息不同:不是有效的cvv或cvv不匹配。

+0

我可以说如果我只是想给出一个普通的信息“这个交易已被拒绝”,那么我不需要验证步骤? –

+2

是的,但是如果你是一个开发者,你根本就不会帮助用户,所以你需要对用户的输入操作进行简单的明确和有意义的错误。 –

+0

是的,我通常会给出更准确的错误信息,但对于信用卡交易,它是否太多暗示? –

0

在所有情况下,您都需要确保处理代码的行为正确,这几乎总是意味着如果您没有所需的输入,则必须使处理失败。在你的处理流程中你在哪里检查事情并不重要,但是“快速失败”并让用户知道发生了什么是一个好习惯。

与此同时,您不想重复代码(保持干爽),这意味着您不应该多次检查相同的问题。