Python 如何使漂亮的汤输出HTML实体?

Python 如何使漂亮的汤输出HTML实体?,python,html,xss,beautifulsoup,Python,Html,Xss,Beautifulsoup,我正在尝试清理和XSS证明来自客户端的一些HTML输入。我正在使用Python2.6和漂亮的汤。我解析输入,去掉所有不在白名单中的标记和属性,并将树转换回字符串 然而 >>> unicode(BeautifulSoup('text < text')) u'text < text' unicode(美化组('text警报(“xss”)< 脚本> 对将被删除,剩下的不仅仅是XSS攻击,甚至是有效的HTML攻击 显而易见的解决方案是将所有&').但只提到实体的解析,而

我正在尝试清理和XSS证明来自客户端的一些HTML输入。我正在使用Python2.6和漂亮的汤。我解析输入,去掉所有不在白名单中的标记和属性,并将树转换回字符串

然而

>>> unicode(BeautifulSoup('text < text'))
u'text < text'
unicode(美化组('text 在我看来,这不像是有效的HTML。还有我的标签剥离器,它为各种各样的肮脏打开了道路:

>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>
>>打印美化组('alert(“xss”))。美化()
<
脚本>警报(“xss”)<
脚本>
对将被删除,剩下的不仅仅是XSS攻击,甚至是有效的HTML攻击

显而易见的解决方案是将所有
&'
).但只提到实体的解析,而不是实体的生成。当然,我可以在所有
navigablesting
节点上运行替换,但由于我可能会错过一些东西,我宁愿让一些经过测试的代码来完成这项工作


Beautiful Soup为什么不退出
这个
lxml.html.clean.Cleaner
类确实允许您使用
allow_tags
参数提供一个标记白名单,并使用feedparser中预计算的属性白名单和
safe_attrs_only
参数。而且lxml肯定能够正确地处理ser上的实体序列化。

我知道这比你原来的问题晚了3.5年,但是你可以使用生成格式良好的HTML。

就像我在原来的问题中写的那样,它不允许我更改属性列表。例如,
tabindex
可以让网站以意想不到的方式运行,并且通过一些想象,各种编码属性但是像
charset
这样的属性也可能被用于恶意目的,而它们很少(如果有的话)有用。我宁愿只允许实际有用(和使用)的属性它们在Fisher分析器接受的属性列表中,这是非常偏执的。如果你是偏执狂,你可以将代码> LxMel.html。DEFS.SuffyAtdis设置成你认为安全的属性。如果不是完全搁置的话,你可能可以重用<代码>饲料分析器。你想要允许的属性。我不喜欢这个列表。
元素就在上面。哦,我刚刚在
lxml/html/defs.py
中发现了一个打字错误:
marque
而不是
marquee
,它仍然存在于svn版本中。我报告了一个bug。这不是什么大问题,但它无助于建立信心…
text
是v吗alid HTML作为
哦,对了。不管怎样,它对
文本做了同样的事情是的,看起来它是从那时起添加的,所以这就是现在的方式,谢谢!