用PHP保护简单的所见即所得编辑器的最佳方法是什么?

7
我在我的网站中添加了一个简单的所见即所得编辑器,它只允许使用B / I / U标签 - 不支持其他标签。 目前,我将所有内容存储为HTML格式在数据库中,但是很容易添加<a onclick='...'>或其他恶意代码。
在PHP中,最好的方式是如何安全地解析此输入? 如何将<b></b><i></i>等作为白名单实现,并对其他所有内容进行编码?
2个回答

13

HTMLPurifier

我只是想提出这个问题,并可能会受到不可避免的抨击。我不会使用strip_tags来保护您的所见即所得表单...从未(除非您想惹恼用户)。

它不能保护您的表格,而且您可能会破坏用户的体验。

Chris Shiftlett在他的博客文章中写了一个很好的段落

我讨厌在我的评论经过像strip_tags()这样的东西时进行评论,这实际上损坏了我想要表达的内容。这让我想起使用IM客户端,尝试识别笑脸并用图像替换它们,常常使回复难以辨认。

另一个原因

另一个回答中的其他人也写了这个,我喜欢:

  $str = "10 appels is <than 12 apples";
  var_dump(strip_tags($str));

我得到的输出是:
string '10 appels is ' (length=13)

我个人不会使用除了HTMLPurifier之外的任何东西

HTMLPurifier

HTMLPurifier

在这里尝试演示: http://htmlpurifier.org/demo.php

并查看这个类似的问题


1
也许您可以推荐HTMLPurifier的正确设置?在演示中尝试使用它时,通常会破坏12个苹果的示例。 - deceze
这对你有用吗?http://bit.ly/mZ3txc 我认为你需要收集错误以确保安全。那应该可以工作了吧? - Layke
是的,那是我找到的唯一设置,只是我不太理解它。为什么要“收集错误”呢? :) - deceze
但请务必保持您的HTMLPurifier安装程序最新,就像任何软件一样。这是一个非常难以解决的问题,因为随着时间的推移,浏览器和HTML的使用不断变化,漏洞也随时被发现。HTMLPurifier可能并不完美,仍然可能让脚本通过 - 这里是几个月前的一组最新漏洞信息。http://secunia.com/advisories/43907/ - Cheekysoft

1

使用strip_tags()函数。http://php.net/manual/zh/function.strip-tags.php

string strip_tags ( string $str [, string $allowable_tags ] )

第二个参数是允许的标签列表;只需列出'<b><i><u>',其余标签将被删除。

请注意,正如deceze所提到的:

此函数不会修改您使用allowable_tags允许的标记上的任何属性,包括一个恶意用户可能在发布将显示给其他用户的文本时滥用的样式和onmouseover属性。

因此,它本身并不能完全保护免受恶意代码的攻击!


4
此函数不会修改您允许使用allowable_tags的标签上的任何属性,包括样式和onmouseover属性。这些属性可能会被恶意用户滥用,当他们发布将显示给其他用户查看的文本时。 - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接