您认为什么是防止表单注入,URL注入或任何其他类型注入的好工具?
对代码不太具体,只是大局。
答案 0 :(得分:5)
就是这样。为了避免脚本注入或任何其他类型的跨站点脚本,您需要确保作为文本的一部分在网页上显示的任何字符不是5个特殊html字符中的任何一个。使用htmlspecialchars
将它们编码为等效的html实体(正常显示,但不由html引擎处理):
对于SQL注入,原则是相同的,通过使用mysql_real_escape_string
,mysqli_real_escape_string
,pg_escape_string
,PHP Data Objects (PDO)
或预准备语句来避免查询中的特殊SQL字符。
要避免shell命令注入,您需要避免使用另一组字符。使用escapeshellcmd
和escapeshellarg
。
对于其他媒体,涉及其他角色,还需要其他功能。有人在评论中说,没有银弹。
答案 1 :(得分:2)
大图最好用术语概括:滤波器输入转义输出(FIEO)。
PHP拥有执行这些功能所需的所有工具,但您需要完全了解每个功能的含义,找出正确的工具并正确应用它。
将PHP视为中间人可能会有所帮助。
在一个方向上,任何PHP都应该处理,任何来自任何外部来源的应该在可能的情况下“过滤”预期。
然后PHP将所有数据传递给必须进行Escaped,以便保护下一个环境免受任何恶意攻击。转义为不会损坏数据库或转义,以便在回显到网页时不会导致XSS攻击,这是最常见的两种情况。
答案 2 :(得分:1)
您正在谈论的各种注射(URL,SQL,表格,标题等);只有当您使用从这些来源检索到的数据时,它们才会发生。
在SQL查询中直接使用_GET / _POST / etc变量的那一刻,返回标题甚至脚本文件名/ url;代码受注射影响。
但是,只要您不只是使用这些变量,并且始终正确地将它们转义为有意义(例如,SQL查询的mysql_real_escape_string),那么注入就不那么容易了。
使用正则表达式在某处使用时验证输入也是可能的,但最弱的链接是你的正则表达式。您必须确保在几乎任何可能的脚本恶意输入上测试正则表达式。
主要的是消毒你的输入。永远不要使用任何可由用户直接更改的内容。