gpt4 book ai didi

python - 如何让 Beautiful Soup 输出 HTML 实体?

转载 作者:技术小花猫 更新时间:2023-10-29 12:53:30 24 4
gpt4 key购买 nike

我正在尝试对来自客户端的一些 HTML 输入进行清理和 XSS 防护。我正在使用 Python 2.6 和 Beautiful Soup。我解析输入,去除所有不在白名单中的标签和属性,然后将树转换回字符串。

然而...

>>> 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 进行替换节点,但由于我可能会遗漏一些东西,所以我宁愿让一些久经考验的代码来完成这项工作。

为什么Beautiful Soup逃不掉< (和其他魔术角色)默认情况下,我如何让它做到这一点?


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

也非常欢迎提出其他清理 HTML 的方法的建议。我不是世界上唯一尝试这样做的人,但似乎没有标准的解决方案。

最佳答案

我知道这是在你最初的问题之后 3.5 年,但你可以使用 formatter='html' argument to prettify(), encode(), or decode()生成格式良好的 HTML。

关于python - 如何让 Beautiful Soup 输出 HTML 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com