【问题标题】:CodeIgniter - why use xss_cleanCodeIgniter - 为什么使用 xss_clean
【发布时间】:2011-03-17 09:26:23
【问题描述】:

如果我正在清理我的 DB 插入,并且还转义了我用 htmlentities($text, ENT_COMPAT, 'UTF-8') 编写的 HTML - 是否还需要使用 xss_clean 过滤输入?它还有什么其他好处?

【问题讨论】:

  • htmlentities($text, ENT_COMPAT, 'UTF-8') 不是停止 xss 的好方法,没有人应该使用它。
  • htmlentities 绝对可以防止 HTML 注入,但如果您曾经使用单引号属性分隔符,则需要 ENT_QUOTES 而不是 ENT_COMPAThtmlspecialchars 通常比 htmlentities 更可取,因为它弄乱字符集的可能性较小。 CodeIgniter 的xss_clean 是一个毫无价值的货物崇拜编程灾区,对字符串处理的构成充满了错误的误解。

标签: php html security codeigniter xss


【解决方案1】:

xss_clean() 很广泛,也很愚蠢。这个函数的 90% 对防止 xss 没有任何作用。比如找alert这个词,而不是document.cookie。没有黑客会在他们的漏洞利用中使用alert,他们会使用 xss 劫持 cookie 或读取 CSRF 令牌来制作 XHR。

但是运行htmlentities()htmlspecialchars() 是多余的。 xss_clean() 解决问题而htmlentities($text, ENT_COMPAT, 'UTF-8') 失败的情况如下:

<?php
print "<img src='$var'>";
?>

一个简单的 poc 是:

http://localhost/xss.php?var=http://domain/some_image.gif'%20onload=alert(/xss/)

这会将onload= 事件处理程序添加到图像标签。停止这种形式的 xss 的方法是 htmlspecialchars($var,ENT_QUOTES); 或者在这种情况下 xss_clean() 也会阻止这种情况。

但是,引用 xss_clean() 文档:

没有什么是 100% 万无一失的, 当然,但我无法得到 任何东西都通过了过滤器。

话虽如此,XSS 是 output problem 不是 input problem。例如,此函数不能考虑变量已经在 &lt;script&gt; 标记或事件处理程序中。它也不会阻止基于 DOM 的 XSS。为了使用最佳功能,您需要考虑您如何使用数据。过滤所有输入数据是一种不好的做法。它不仅不安全,而且还会破坏数据,使比较变得困难。

【讨论】:

  • XSS 输出问题而不是输入问题,这就是为什么像xss_clean()这样的东西永远不能成为解决XSS的可靠方法问题(而xss_clean() 本身就是一个可笑的糟糕实现,即使是低标准的反 XSS 工具也是如此)。我很惊讶您似乎认可它是您第一句话中输出级转义的更好替代方案。
  • @bobince 你完全正确。事实上,在 xss_clean() 中进行的 90% 的检查对安全性没有任何作用。比如寻找alert()而不是document.cookie。但后来在我的帖子中,我确实说过 xss 是一个输出问题,并且只有一种方法可以让我知道 xss 的可能性。但是我会更新这篇文章。
  • 谢谢,这样更好!实际上,xss_clean 的当前版本似乎确实在寻找 document.cookie... 虽然显然这仍然完全没用,因为它不会捕获 document . cookiedocument['cookie'] 或任何其他您可以参考的数千种方式它。
  • @bobince 哈哈,是的,这是一次徒劳的安全尝试。
  • 更准确地说,Security 类 (codeigniter\2.1.4\core\Security.php) 会寻找这个词: $words = array('javascript', 'expression', 'vbscript' , '脚本', 'base64', 'applet', 'alert', 'document', 'write', 'cookie', 'window');它不会对抗真正的 XSS 攻击。
【解决方案2】:

在你的情况下,"stricter methods are fine, and lighter weight"。 CodeIgniter 开发人员打算将 xss_clean() 用于不同的用例,“允许‘安全’HTML 标记的评论系统或论坛”。这在文档中并不清楚,其中 xss_clean 显示为应用于用户名字段。

还有另一个从不使用 xss_clean() 的原因,到目前为止,它还没有在 stackoverflow 上突出显示。 xss_clean() 在20112012 期间被破坏,不可能完全修复。至少没有完全重新设计,这并没有发生。 At the moment, it's still vulnerable to strings like this:

<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a>

xss_clean() 的当前实现首先有效地将 urldecode() 和 html_entity_decode() 应用于整个字符串。这是必需的,因此它可以对诸如“javascript:”之类的内容进行简单的检查。最后,返回解码后的字符串

攻击者可以简单地对其漏洞利用进行两次编码。它将被 xss_clean() 解码一次,并以干净的方式传递。然后你就有了一个单独编码的漏洞利用,准备在浏览器中执行。

我称这些检查“幼稚”且无法修复,因为它们在很大程度上依赖于正则表达式。 HTML 不是常规语言。 You need a more powerful parser to match the one in the browser; xss_clean() 没有类似的东西。也许可以将 HTML 的一个子集列入白名单,它可以用正则表达式干净地进行词法分析。但是,当前的 xss_clean() 是一个非常黑名单。

【讨论】:

    【解决方案3】:

    我建议使用http://htmlpurifier.org/ 进行 XSS 净化。我正在扩展我的 CodeIgniter Input 类以开始利用它。

    【讨论】:

    【解决方案4】:

    是的,您应该仍在使用它,我通常规定至少在面向公众的输入上使用它,这意味着任何人都可以访问和提交的任何输入。

    通常清理数据库查询的输入似乎是一种副作用,因为该函数的真正目的是防止Cross-site Scripting Attacks

    我不会详细介绍 xss_clean 所采取的每一步的细节,但我会告诉你它比你提到的几个步骤做得更多,我已经 pastied the source of the xss_clean function( deadlink),所以你可以自己看看,它是完整的评论。

    【讨论】:

      【解决方案5】:

      如果您希望过滤器在每次遇到 POST 或 COOKIE 数据时自动运行,您可以通过打开 application/config/config.php 文件并设置以下内容来启用它: $config['global_xss_filtering'] = TRUE;

      您可以通过打开您的 application/config/config.php 文件并设置以下内容来启用 csrf 保护: $config['csrf_protection'] = TRUE;

      更多详情,请参阅以下链接。

      https://ellislab.com/codeigniter/user-guide/libraries/security.html

      【讨论】:

      • 他们现在不推荐global_xss_filtering。请参阅:codeigniter.com/user_guide/libraries/input.html“'global_xss_filtering' 设置已弃用,仅出于向后兼容的目的而保留。XSS 转义应该在输出上执行,而不是输入!”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多