正则表达式是否足以处理脚本注入



您认为还有什么是防止表单注入、URL注入或任何其他类型注入的好工具?

代码不太具体,只是总体情况。

过滤输入/验证输出

就是这样。为了避免脚本注入或任何其他类型的跨站点脚本,你需要确保网页上作为文本一部分显示的任何字符都不是5个特殊的html字符中的任何一个。使用htmlspecialchars将它们编码为等效的html实体(正常显示,但不由html引擎处理):

  • &变成&amp
  • >变成&gt
  • <变成&lt
  • '变成&039
  • "变成"

对于SQL注入,原理是一样的,通过使用mysql_real_escape_stringmysqli_real_escape_stringpg_escape_stringPHP Data Objects (PDO)或准备好的语句,在查询中避免使用特殊的SQL字符。

为了避免shell命令注入,您需要避免另一组字符。使用escapeshellcmdescapeshellarg

对于其他媒介,还涉及其他角色,以及其他需要的功能。正如有人在评论中所说,没有灵丹妙药。

总体情况最好用以下术语来概括:过滤器输入转义输出(FIEO)。

PHP拥有执行这些功能所需的所有工具,但您需要充分了解它们的含义,确定正确的工具并正确应用。

将PHP视为在中间可能会有所帮助。

在一个方向上,PHP期望处理的任何事情,来自任何外部源,都应该尽可能根据预期进行"筛选"。

PHP传递数据的任何东西都必须进行Escaped,这样下一个环境就可以免受任何恶意攻击。转义是为了不损坏数据库,或者转义是为了在网页上响应时不会引起XSS攻击,这是两种最常见的情况。

您谈论的各种注入(URL、SQL、Form、Headers等);只有在使用从此类来源检索到的数据时,才可能发生这些情况。

当您直接在SQL查询中使用_GET/POST/etc变量时,会返回标头,甚至脚本文件名/URL;代码受到注入的影响。

然而,只要您不只是使用这些变量,并且始终正确地转义它们以使其有意义(例如,SQL查询的mysql_real_eescape_string),那么注入就不再那么容易了。

在某个地方使用regex来验证输入也是可能的,但最薄弱的环节是正则表达式。您必须确保在脚本中几乎所有可能的恶意输入上测试正则表达式。

最重要的是净化你的输入。永远不要使用任何可以由用户直接更改的内容。

最新更新