2010-10-28 58 views
3

我想接受来自用户的html输入并将其发布到我的网站上,同时也希望确保它不会因为html代码而导致我的网站模板出现问题。html净化器的替代方案

我以前使用的是HTML净化器,但Html净化器不能在我的一台服务器上工作。所以我正在寻找最佳选择。 这是纯粹用PHP编写的。 可以解决像

</div> it is dirty code as div is closed without opening. 

回答

4

肮脏的HTML代码,你可以尝试PHP Tidy,这是在PHP整洁库。

+0

我想它应该。查看安装页面,它说这个模块捆绑了PHP> = 5。 – 2010-10-28 23:11:45

+0

谢谢。我正在寻找它 – 2015-06-18 03:41:40

0

我相信Tidy会帮你关闭你的标签,但它不像HTML Purifier那样全面,它可以删除有效但不需要的标签或属性(即JavaScript onclick事件,类似的东西)。

请注意,Tidy需要在您的服务器上安装libtidy,所以它不仅仅是直接的PHP。

我知道帕德里克·布雷迪一直致力于研究替代HTML净化器Zend框架,但我认为它只是实验代码此时

http://framework.zend.com/wiki/pages/viewpage.action?pageId=25002168

http://github.com/padraic/wibble

+0

我试过了。但它有很多错误。 – 2010-10-28 23:25:25

+0

耻辱。我建议要么尝试让HTML Purifier工作,要么尝试Tidy。 – simonrjones 2010-10-30 20:34:01

+0

但我想尝试一下。所以试过了,所以告诉你对此的回应。 – 2010-11-07 16:59:47

4

简单的解决方案,而三阶第三方库:创建一个DOMDocument并在您的输入上调用loadHTML。如果仅解析一小段代码,则将输入与<html><body>标记包围。你可能也想压制警告,因为你会让它们吐出一些常见的不良HTML。

然后简单地遍历生成的文档树,删除没有包含在已知好的列表中的任何元素和属性。您还应该检查允许的URL属性,以确保它们使用已知好的方案,如http:,而不是像javascript:这样的潜在麻烦方案。如果你想多花一点时间,你可以检查只有允许的元素组合嵌套在一起(这更容易让你允许的元素数量更少)。

最后,使用saveHTML再次将片段的节点序列化。因为您是从DOM创建新的标记,而不是保留原始的可能格式不正确的标记,所以这是您阻止的一类奇怪的标记注入技术。