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

时间:2011-06-27 07:47:32

标签: php

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

对代码不太具体,只是大局。

3 个答案:

答案 0 :(得分:5)

过滤输入/验证输出

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

  • &安培;成为& amp;
  • >变成& gt;
  • <变成& lt;
  • '变为'
  • “变成& quot;

对于SQL注入,原则是相同的,通过使用mysql_real_escape_stringmysqli_real_escape_stringpg_escape_stringPHP Data Objects (PDO)或预准备语句来避免查询中的特殊SQL字符。

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

对于其他媒体,涉及其他角色,还需要其他功能。有人在评论中说,没有银弹。

答案 1 :(得分:2)

大图最好用术语概括:滤波器输入转义输出(FIEO)。

PHP拥有执行这些功能所需的所有工具,但您需要完全了解每个功能的含义,找出正确的工具并正确应用它。

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

在一个方向上,任何PHP都应该处理,任何来自任何外部来源的应该在可能的情况下“过滤”预期。

然后PHP将所有数据传递给必须进行Escaped,以便保护下一个环境免受任何恶意攻击。转义为不会损坏数据库或转义,以便在回显到网页时不会导致XSS攻击,这是最常见的两种情况。

答案 2 :(得分:1)

您正在谈论的各种注射(URL,SQL,表格,标题等);只有当您使用从这些来源检索到的数据时,它们才会发生。

在SQL查询中直接使用_GET / _POST / etc变量的那一刻,返回标题甚至脚本文件名/ url;代码受注射影响。

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

使用正则表达式在某处使用时验证输入也是可能的,但最弱的链接是你的正则表达式。您必须确保在几乎任何可能的脚本恶意输入上测试正则表达式。

主要的是消毒你的输入。永远不要使用任何可由用户直接更改的内容。