如何生成漂亮的Soup输出HTML实体?

2024-05-23 21:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试清理和XSS验证来自客户端的一些HTML输入。我用的是Python 2.6和靓汤。我解析输入,去掉所有不在白名单中的标签和属性,并将树转换回字符串。

但是。。。

>>> unicode(BeautifulSoup('text < text'))
u'text < text'

在我看来,这不像是有效的HTML。有了我的脱衣舞娘,它为各种肮脏的事情开辟了道路:

>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>

<script></script>对将被删除,剩下的不仅是XSS攻击,甚至是有效的HTML。

最明显的解决方案是用&lt;替换所有<字符,这些字符在解析后被发现不属于标记(类似于>&'")。但是Beautiful Soup documentation只提到实体的解析,而不是实体的产生。当然,我可以在所有的NavigableString节点上运行replace,但是由于我可能会遗漏一些东西,所以我宁愿让一些经过测试的代码来完成这项工作。

为什么漂亮的汤在默认情况下无法逃脱<(和其他魔法角色),我该如何做到这一点?


注意:我也看过lxml.html.clean。它似乎是在黑名单的基础上工作的,而不是白名单,所以对我来说似乎不是很安全。标签可以白名单,但属性不能,它允许太多的属性适合我的口味(例如tabindex)。此外,它在输入<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>上给出AssertionError。不好的。

对于清理HTML的其他方法的建议也非常受欢迎。我不是世界上唯一一个想这么做的人,但似乎没有标准的解决方案。


Tags: 字符串text实体客户端属性htmlscriptalert