【问题标题】:Circumventing htmlspecialchars(addslashes(input)) for HTML/JavaScript injection绕过 htmlspecialchars(addslashes(input)) 进行 HTML/JavaScript 注入
【发布时间】:2015-01-30 17:27:17
【问题描述】:

假设一些 PHP 代码回显了通过首先应用 addslashes() 然后 htmlspecialchars() 对 HTML 文档进行清理的输入。我听说这是一种不安全的方法,但不知道为什么。

任何关于可以将何种格式应用于危险输入(例如脚本标签中的 JavaScript)以绕过这两个函数强加的安全措施的建议将不胜感激。

【问题讨论】:

  • ... 或使用库来清理您的输出,例如:htmlpurifier.org - 比 RYO 方法更不让人头疼(尤其是当您处理英语以外的语言时,使用UTF-8 字符集,你想要 ß 而不是 ß);它也确保了有效的标记。

标签: php html htmlspecialchars addslashes


【解决方案1】:

addslashes 与 XSS 无关(在实际有用的地方几乎总是有更好的东西)。

htmlspecialchars 不是不安全的方法。它本身是不够的。

如果您将内容作为“安全”元素的主体,htmlspecialchars 将保护您。

如果您将内容作为“安全”属性的值,并且您也正确引用了该值,它将保护您。

如果您将其作为“不安全”属性或元素(其中内容可能被视为 JavaScript)的值,例如 <script>onmoseoverhref 或 @987654327,它不会保护您@。


例如:

<!-- http://example.com/my.php?message=", steal_your_cookies(), " -->
<!-- URL not encoded for clarity. Imagine the definition of steel_your_cookies was there too -->

<button onclick='alert("<?php echo htmlspecialchars($_GET['message']); ?>")'>
   click me
</button>

会给你:

<button onclick='alert("&quot;, steal_your_cookies(), &quot;")'>
   click me
</button>

意思是一样的:

<button onclick='alert("", steal_your_cookies(), "")'>
   click me
</button>

当您点击按钮时,它会窃取您的 cookie。

【讨论】:

  • 我认为如果使用 htmlspecialchars 对值进行转义并正确引用,则可以在“不安全”元素和属性中插入变量。转义会删除引号字符,因此您需要再次包围内容。例如。 var a = '';
  • @Phil_1984_ — 不,这不是远程安全的。转义不会删除引号字符。它对它们进行转义,因此它们被视为内容而不是 HTML。这意味着在不安全的上下文中(例如 onclick='alert("&lt;?echo htmlspecialchars($_GET['message']); ?&gt;");',用户可以键入 ' 并将其视为 JavaScript ' 而不是 HTML '。这让他们可以将任何他们喜欢的 JS 放在那里. 那不安全!
  • @Phil_1984_ — 使用 ENT_QUOTES 不会产生影响(对于此示例),因为在被转义的数据中没有 '
  • 很好的例子。是的,你当然是完全正确的。我的第一条评论是错误的。因为它在javascript中,我是否也需要做addlashes?我猜是因为 htmlspecialchars 用于 html 转义,而 addSlashes 用于 javascript 转义?
  • json_encode 是为 JS 转义数据的更好选择。
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 2012-02-05
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
相关资源
最近更新 更多