最常见的 "best" 清理和验证 PHP 表单的方法?
The most common, "best" way to sanatize and validate PHP Forms?
在多次尝试编写可以 sanatize/validate $_POST["input"] PHP 形式的代码后,我不得不问总的来说,因为每次尝试都没有像我预期的那样奏效。我真的尝试了很多,2 个月前我才开始练习编码(html、css、bootstrap、wordpress、php)。我希望你能告诉我,如你所见,什么是最常见的或 "best" 消毒 php 表格的方法。
我重写了一些 OOP PDO 表单验证,当我将它集成到新主页时无法运行,因为我的 OOP 技能 = 0。
它是用 类 构建的,但我没有看到任何准备好的语句,这让我很惊讶,因为准备好的语句在网络上被偶像化了。
哪种方法更好,你能告诉我为什么吗?
我希望你能回答我的问题并解释一下我如何在 "pro-way" 中处理它,这在最好的情况下是安全的,因为它对我来说是一个障碍。
感谢您的帮助。
首先,您不应该在任何上下文中连接验证和 "sanitization"。那是两个完全不同的事情,。
验证确实必须应用于表单数据,并且没有通用的方法来执行此操作。只需使用您的常识、业务逻辑需求和框架准则。
而"sanitization"则另当别论。甚至这个词本身也是 PHP 人最大的错误,总是被误用和混淆。
"sanitize" 的最佳方法是根本不进行消毒。因为
- 你不能"sanitize"你的数据,不管你在术语下的意思是什么。
- 任何 "sanitization" 都会破坏数据。
- 这个数据实际上可能有很多目的地。你不可能拥有一劳永逸的解决方案。
- 重要的是目的地,而不是来源。意味着您不应该将准备好的语句用于 POST 变量,而是用于 SQL 查询。大不同。
您应该格式化,而不是"sanitize"。根据特定当前目的地的规则进行格式化。
要为 SQL 查询格式化数据,您必须使用准备好的语句。
要为其他目的地格式化您的数据,您必须遵守他们的规则。再一次,不是 "post form" 而是所有数据,尽管其来源。
"Your Common Sense"的答案绝对正确。
所以你应该首先验证你的表单(客户端),有很多小的验证库,例如:http://rickharrison.github.io/validate.js/
在 posted 时,您必须检查此数据是否符合您的预期。
电子邮件只是一封电子邮件,名称只是一个没有 XSS 或 SQL 注入东西的字符串.....
所以要看上面回答说的目的地。
要过滤某些 post 值,例如:http://php.net/manual/en/function.filter-var.php
您还可以使用完整的框架或库来对抗 sql 注入和 XSS 东西。你应该使用 MySQLi prepared statements 和一些其他的东西来对抗 XSS,比如:HTMLPurifier http://htmlpurifier.org/
这些只是一些示例,如果您有兴趣,我建议您阅读此页面:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
在多次尝试编写可以 sanatize/validate $_POST["input"] PHP 形式的代码后,我不得不问总的来说,因为每次尝试都没有像我预期的那样奏效。我真的尝试了很多,2 个月前我才开始练习编码(html、css、bootstrap、wordpress、php)。我希望你能告诉我,如你所见,什么是最常见的或 "best" 消毒 php 表格的方法。
我重写了一些 OOP PDO 表单验证,当我将它集成到新主页时无法运行,因为我的 OOP 技能 = 0。
它是用 类 构建的,但我没有看到任何准备好的语句,这让我很惊讶,因为准备好的语句在网络上被偶像化了。
哪种方法更好,你能告诉我为什么吗?
我希望你能回答我的问题并解释一下我如何在 "pro-way" 中处理它,这在最好的情况下是安全的,因为它对我来说是一个障碍。
感谢您的帮助。
首先,您不应该在任何上下文中连接验证和 "sanitization"。那是两个完全不同的事情,
验证确实必须应用于表单数据,并且没有通用的方法来执行此操作。只需使用您的常识、业务逻辑需求和框架准则。
而"sanitization"则另当别论。甚至这个词本身也是 PHP 人最大的错误,总是被误用和混淆。
"sanitize" 的最佳方法是根本不进行消毒。因为
- 你不能"sanitize"你的数据,不管你在术语下的意思是什么。
- 任何 "sanitization" 都会破坏数据。
- 这个数据实际上可能有很多目的地。你不可能拥有一劳永逸的解决方案。
- 重要的是目的地,而不是来源。意味着您不应该将准备好的语句用于 POST 变量,而是用于 SQL 查询。大不同。
您应该格式化,而不是"sanitize"。根据特定当前目的地的规则进行格式化。
要为 SQL 查询格式化数据,您必须使用准备好的语句。
要为其他目的地格式化您的数据,您必须遵守他们的规则。再一次,不是 "post form" 而是所有数据,尽管其来源。
"Your Common Sense"的答案绝对正确。
所以你应该首先验证你的表单(客户端),有很多小的验证库,例如:http://rickharrison.github.io/validate.js/
在 posted 时,您必须检查此数据是否符合您的预期。 电子邮件只是一封电子邮件,名称只是一个没有 XSS 或 SQL 注入东西的字符串.....
所以要看上面回答说的目的地。
要过滤某些 post 值,例如:http://php.net/manual/en/function.filter-var.php
您还可以使用完整的框架或库来对抗 sql 注入和 XSS 东西。你应该使用 MySQLi prepared statements 和一些其他的东西来对抗 XSS,比如:HTMLPurifier http://htmlpurifier.org/
这些只是一些示例,如果您有兴趣,我建议您阅读此页面:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet