我正在努力保护来自外部源的HTML,以便在我自己的web控制面板上显示(在浏览器中加载、读取和删除(。
strip_tags
是完全不安全和无用的。
为了使自己的基于DOMDocument
的HTML更安全,我经历了大量的麻烦,删除了不安全的元素和属性。然后我链接到了一个噩梦般的网页:https://owasp.org/www-community/xss-filter-evasion-cheatsheet
这份文件使我相信;聪明的";HTML安全性还不够——在HTML中注入恶意代码的方法比我想象的要多得多。那一大堆东西真让我毛骨悚然。多么冷的淋浴啊。
无论如何,在为PHP寻找一个(非谷歌入侵的(HTML安全器时,我发现:http://htmlpurifier.org/
虽然乍一看还可以,但一些迹象表明,在安全环境中,你最不希望看到的就是草率:
- 打开http://htmlpurifier.org/download,它声称这是官方存储库:https://repo.or.cz/w/htmlpurifier.git
- 但该页面最后一次更新是在";2018-02-23";,带有标签";哎呀,忘了编辑WHATSNEW">
- 与#1中相同的页面将Github链接称为";"普通老镜子";,但该存储库有当前(2020年(的更新。。。那么,那真的是用过的那个吗?嗯?https://github.com/ezyang/htmlpurifier/tree/master
- 在https://github.com/ezyang/htmlpurifier/blob/v4.13.0/NEWS,上面写着:";对PHP 6.4支持的进一步改进";。从来没有PHP 6.4
我对那个项目的看法是,它是由非常草率和粗心的人运行的。那些犯了这么多错误却很少注意保持网站正确的人真的能被信任写安全的代码来净化HTML吗?
我希望我从来没有被链接到那个页面的漏洞。我为自己的代码感到骄傲,尽管代码行数不多,但我还是花了很多时间在上面。
这真的让我想知道其他人在用什么(不是谷歌制造的(。CCD_ 3显然是一个完整的";否";,但我的CCD_ 4代码也是如此。例如,它检查是否有href以(不区分大小写("开头;javascript:";,但是噩梦页面显示;不可见的";诸如";ja vascript:";并添加编码的字符和一切来破坏我的代码;javascript:";href。还有许多其他的事情,我根本不可能坐在自己的代码中解决。
对于这个关键而常见的任务,PHP中真的没有real_strip_tags
或其他东西吗?
HTML Purifier是一个非常好的、经过建立和测试的库,尽管我理解为什么不清楚哪个存储库是正确的存储库真的不是很鼓舞人心。:(它不像过去那样积极地工作,但在这种情况下这并不是一件坏事,因为它采用了白名单方法。新的、令人兴奋的HTML可能会破坏你的页面,但白名单并不知道,它被删除了;如果你想让HTML净化器了解这些标签和属性,你需要在它们成为威胁之前教会它它们是如何工作的。
也就是说,基于DOMDocument
的代码不一定是错误的方法,但如果你做得好,你可能会再次使用HTML净化器,它基本上解析HTML,对标签、属性及其值应用标准感知白名单,然后重新组装HTML。
(附带说明,由于这更多的是一个最佳实践的问题,您可能会在软件工程堆栈交换网站上得到更好的答案,而不是堆栈溢出。(