我正在尝试清理和XSS证明一些来自客户端的HTML输入。我正在使用python2.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
靓汤为何逃不掉
<
(和其他魔术角色)默认情况下,我该如何使它做到这一点?
lxml.html.clean
. 它似乎是在黑名单的基础上工作的,而不是白名单,所以对我来说似乎不太安全。标签可以被列入白名单,但是属性不能,而且它允许太多符合我口味的属性(例如。
tabindex
). 此外,它还提供了一个
AssertionError
在输入端
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
. 不好的。
对于清理HTML的其他方法的建议也是非常受欢迎的。我并不是世界上唯一一个这样做的人,但似乎没有标准的解决方案。