【问题标题】:Sanitize everything to text with htmlpurifier使用 htmlpurifier 将所有内容清理为文本
【发布时间】:2014-01-12 22:16:34
【问题描述】:

我对 xss 保护还很陌生,这让我开始思考它是否安全。

如果我使用例如:

$lol = "javascript:alert('asd')";

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$config->set('HTML.Allowed', '');
$cleaned = $purifier->purify($lol);


<a href="<?php echo $cleaned; ?>"><?php echo $cleaned; ?></a>

上面的代码仍然会输出一个警报功能,例如,如果我按下一个链接,就会显示一个弹出窗口。

考虑到 XSS 是否安全?

我也使用$config-&gt;set('HTML.Allowed', '');,因为我只想输出文本而不输出任何 HTML。

为了安全起见,我是否应该添加一个正则表达式来检查;: 例如[^:;]

值得指出的是,用户提交给我网站的所有数据只会在&lt;p&gt;标签和&lt;h1&gt;标签之间输出。

提前致谢,

// XSS 新手。

【问题讨论】:

  • 旁注:HTML Purifier 没有捕获的原因是因为它不是 HTML - 它是 HTML 属性中的数据。如果您将&lt;a href="javascript:alert('asd')"&gt;javascript:alert('asd')&lt;/a&gt; 放入HTML Purifier 中,它会做您想做的事——因为此时它知道它必须将javascript:alert('asd') 视为一个链接。但就像 Pez 说的那样,对于您想要实现的目标来说,这可能是矫枉过正。 :)

标签: php xss sanitization htmlpurifier


【解决方案1】:

不要使您的清理工作过于复杂,只需执行$cleaned = htmlentities($lol); 这会将所有可能的 html 标记转换为相应的 html 实体作为字符串。

你说my site will only be outputted between &lt;p&gt; tags and &lt;h1&gt; tags,所以在这种情况下,一个 htmlentities 将出现,因为用户将无法使用 html,因此他们无法创建链接。

但是在这个测试用例中,即使在删除了 html 标记(例如,$lol 中没有 html 标记)之后,您仍将 $cleaned 字符串回显到 a href 中,因此有效的 javascript 是仍然输出。

XSS 通常依赖于脚本标签,例如&lt;script&gt;alert('asd');&lt;/script&gt; 在这种情况下没有。

如果您仍然希望能够回显到 ahref,我可以建议从前面去掉 javascript: 这个词吗?或者也许将所有非字母数字字符转换为 html 实体。

【讨论】:

  • 谢谢,但由于我只输出硬编码

    标签内的数据,我可以在将数据插入数据库时​​简单地使用 strip_tags,然后使用 htmlspecialchars($the_data) ;当我输出它?我只是想确保没有 xss 可以通过它,并且我使用 bind_param 来防止 sql-inject

  • @user2722667 htmlspecialchars(strip_tags($input)) 应该做你想做的并且是安全的,是的。 :) (不过,不要忘记htmlspecialchars() 的其他两个参数;编码尤其重要。)
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 2022-01-04
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多