2013-07-04 109 views
10

我已经使用php(以及前端的js)对所有输入数据实现了输入验证。我正在类型转换,我可以验证像正则表达式的电子邮件的东西,确保下拉列表值只是我期待的,而且在很多情况下,我只希望有一个字符串我有一个正则表达式,它只运行字母,数字和空格。任何不符合这些规则的结果都会导致表单失败,并且没有运行sql查询。输入消毒VS验证

随着中说,如果我的形式通过验证我做它的输入安全在我的分贝的假设(这我通过PDO做),然后逃脱输出。

因此,既然说我为什么需要输入清理?

+1

我会说,你是以下一个接受的方法。消毒和验证(一起)并不总是必要的。虽然,我是深度防守的粉丝,所以我可能会这样做。但“拒绝已知的不良”和“接受已知的好”也被认为是可以接受的。 https://www.owasp.org/index.php/Data_Validation – cmt

回答

7

如果你有非常严格的验证服务器端,你不需要sanatize。例如。根据/^[a-z0-9] {5,25}验证一个字符串$ /不需要任何消毒处理(删除非字母数字字符将毫无意义,因为它们不应该能够通过)。

只要确保你可以验证所有的数据,如果这是不可能的(例如,用HTML它往往是有点难度),你可以使用转义策略或东西像HTML净化器。

有关为XSS预防逃逸战略一个很好的概述: 看到https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

对于不同安全威胁的一个想法: https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet

+0

使用是的,我深谙在owasp上的内容。谢谢 –

3

你需要两个。验证输入数据很容易在客户端殴打,但对于不想破解你的合法用户很有用。 在将数据放入数据库之前,将数据(所有数据,无论是输入数据还是直接来自数据库的数据)进行消毒处理,您认为您应该能够信任该数据。

即使您100%信任您的验证并在服务器端进行(理论上,人们不应该能够混淆数据),但仍然值得使用某种形式的消毒,因为这是一种好习惯进入。

+0

即使您对您的验证过于自信,为何要冒这个风险? –

+0

的确,我希望尽可能安全,所以为了解决我的困惑,我问了这个问题。我在验证和消毒之间唯一的区别是验证在测试输入时返回真或假,而消毒实际上取代了不需要的字符。我将最终对一个正则表达式进行验证,然后使用相同的正则表达式对它们进行消毒,但使用preg_replace.Just看起来有点落后。 –

+2

一个上下文,其中消毒可以进来它自己的是我无法验证,即积极的自由文本字段,用户可以输入非字母数字字符...然后我可以看到消毒 –