我正在尝试清理和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。
最明显的解决方案是用<
替换所有<
字符,这些字符在解析后被发现不属于标记(类似于>&'"
)。但是Beautiful Soup documentation只提到实体的解析,而不是实体的产生。当然,我可以在所有的NavigableString
节点上运行replace,但是由于我可能会遗漏一些东西,所以我宁愿让一些经过测试的代码来完成这项工作。
为什么漂亮的汤在默认情况下无法逃脱<
(和其他魔法角色),我该如何做到这一点?
注意:我也看过lxml.html.clean
。它似乎是在黑名单的基础上工作的,而不是白名单,所以对我来说似乎不是很安全。标签可以白名单,但属性不能,它允许太多的属性适合我的口味(例如tabindex
)。此外,它在输入<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
上给出AssertionError
。不好的。
对于清理HTML的其他方法的建议也非常受欢迎。我不是世界上唯一一个想这么做的人,但似乎没有标准的解决方案。
目前没有回答
相关问题 更多 >
编程相关推荐