您认为还有什么是防止表单注入、URL注入或任何其他类型注入的好工具?
代码不太具体,只是总体情况。
过滤输入/验证输出
就是这样。为了避免脚本注入或任何其他类型的跨站点脚本,你需要确保网页上作为文本一部分显示的任何字符都不是5个特殊的html字符中的任何一个。使用htmlspecialchars
将它们编码为等效的html实体(正常显示,但不由html引擎处理):
- &变成&
- >变成>
- <变成<
- '变成&039
- "变成"
对于SQL注入,原理是一样的,通过使用mysql_real_escape_string
、mysqli_real_escape_string
、pg_escape_string
、PHP Data Objects (PDO)
或准备好的语句,在查询中避免使用特殊的SQL字符。
为了避免shell命令注入,您需要避免另一组字符。使用escapeshellcmd
和escapeshellarg
。
对于其他媒介,还涉及其他角色,以及其他需要的功能。正如有人在评论中所说,没有灵丹妙药。
总体情况最好用以下术语来概括:过滤器输入转义输出(FIEO)。
PHP拥有执行这些功能所需的所有工具,但您需要充分了解它们的含义,确定正确的工具并正确应用。
将PHP视为在中间可能会有所帮助。
在一个方向上,PHP期望处理的任何事情,来自任何外部源,都应该尽可能根据预期进行"筛选"。
PHP传递数据的任何东西都必须进行Escaped,这样下一个环境就可以免受任何恶意攻击。转义是为了不损坏数据库,或者转义是为了在网页上响应时不会引起XSS攻击,这是两种最常见的情况。
您谈论的各种注入(URL、SQL、Form、Headers等);只有在使用从此类来源检索到的数据时,才可能发生这些情况。
当您直接在SQL查询中使用_GET/POST/etc变量时,会返回标头,甚至脚本文件名/URL;代码受到注入的影响。
然而,只要您不只是使用这些变量,并且始终正确地转义它们以使其有意义(例如,SQL查询的mysql_real_eescape_string),那么注入就不再那么容易了。
在某个地方使用regex来验证输入也是可能的,但最薄弱的环节是正则表达式。您必须确保在脚本中几乎所有可能的恶意输入上测试正则表达式。
最重要的是净化你的输入。永远不要使用任何可以由用户直接更改的内容。