清理(​​不删除)用于破坏文档的HTML输入,而不是其他标记

时间:2011-06-28 12:56:55

标签: php html sanitization xss

让我们假设我们有一个生成HTML输入的用户表单,以下内容可以作为发送给PHP的内容的一个示例。

<p>Hello</p>
<p><strong>World</strong></p>

现在,这些将在稍后通过注入HTML输出显示到某些DIV中。

我想要阻止的是输入以下内容:

</div>
<p>Hello</p>
<p><strong>World</strong></p>
<div>

甚至可能是:

</div>
<script> someScript(); </script>
<iframe src="http://www.example.com">......
<p>Hello</p>
<p><strong>World</strong></p>
<div>

如何使用PHP确定此输入不会破坏文档,包含错误的iframe或运行脚本?最重要的部分是我仍然需要这些信息,我不是要把它丢掉,但它需要被包含在某种无害的文本中。

使用替代标记不是一种选择,它必须是HTML。

2 个答案:

答案 0 :(得分:4)

您需要的是htmlpurifier

不仅可以根据标准输出html,还可以清除xss漏洞中发布的代码。

编辑1 :您还应该check the comparison,有趣的是:)

修改2 :您还可以查看htmlspecialcharshtmlentities 但是,对于像你这样的更复杂的东西,imo htmlpurifier更好,更可定制。

答案 1 :(得分:1)

如果你想保留破碎的标签但是让它们无害,我建议保存两次。将未修改的发布数据保存到一个数据库列中,将Purified保存到另一个数据库列中。通常显示纯化版本,仅在需要时显示危险版本。

HTML Purifier支持论坛上的某个地方有一个如何将<a href="dangerous.url.or.javascript">text</a>更改为<span>text (dangerous.url.or.javascript)</span>的示例。当你说要保留信息时,这可能是你正在寻找的东西,而不是把它丢弃。

HTML Purifier是高度可定制的,作者Ambush Commander在HTML Purifier论坛和StackOverflow上都非常有用。