使用htmlpurifier清理文本中的所有内容

时间:2014-01-12 12:45:10

标签: php xss sanitization htmlpurifier

我对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->set('HTML.Allowed', '');因为我只想输出文本而不想输入任何HTML。

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

值得指出的是,用户提交到我网站的所有数据都只会在<p>代码和<h1>代码之间输出。

提前致谢,

// XSS新手。

1 个答案:

答案 0 :(得分:3)

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

你说my site will only be outputted between <p> tags and <h1> tags所以在这种情况下,由于用户无法使用html,因此他们无法创建链接,因此会出现问题。

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

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

如果你仍然希望能够回应一个ahref,我可以建议从前面剥离javascript这个词吗?或者将所有非字母数字字符转换为html实体。