我已经使用 php(以及前端的 js)对所有输入数据进行了输入验证。我正在尽可能地进行类型转换,针对正则表达式验证电子邮件之类的内容,确保下拉值只是我期望的值,而且在许多情况下我只期望一个字符串我有一个运行的正则表达式只允许字母、数字和空格。任何不符合这些规则的内容都会导致表单验证失败并且不会运行任何 sql 查询。
话虽如此,如果我的表单通过验证,我假设输入到我的数据库是安全的(我正在通过 pdo 执行此操作),然后在输出时转义。
话虽如此,为什么我需要输入清理?
我已经使用 php(以及前端的 js)对所有输入数据进行了输入验证。我正在尽可能地进行类型转换,针对正则表达式验证电子邮件之类的内容,确保下拉值只是我期望的值,而且在许多情况下我只期望一个字符串我有一个运行的正则表达式只允许字母、数字和空格。任何不符合这些规则的内容都会导致表单验证失败并且不会运行任何 sql 查询。
话虽如此,如果我的表单通过验证,我假设输入到我的数据库是安全的(我正在通过 pdo 执行此操作),然后在输出时转义。
话虽如此,为什么我需要输入清理?
如果您有非常严格的服务器端验证,则无需进行清理。例如。针对 /^[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
你需要两者。验证输入数据在客户端很容易被击败,但它对于不想破解你的合法用户很有用。在将数据放入数据库之前,对数据(所有数据,无论是输入数据还是直接来自您认为应该能够信任的数据库的数据)进行清理。
即使您 100% 信任您的验证并在服务器端进行验证(理论上,人们不应该弄乱数据),仍然值得使用某种形式的清理,因为这是一个养成的好习惯.