有没有一个开源的Python库可以对HTML进行消毒并删除所有Javascript?

4
我想编写一个Web应用程序,允许用户输入任何出现在<div>元素内部的HTML。这个HTML将会被显示给其他用户,因此我希望确保该站点不会让人们受到XSS攻击。
是否有一个很好的Python库可以从HTML或DOM树中清除所有事件处理程序属性、<script>元素和其他JavaScript垃圾?
我打算使用Beautiful Soup来规范化HTML,以确保它不包含未关闭的标记等内容。但是,据我所知,它没有预先打包的方法来剥离所有JavaScript。
如果有其他语言中的一个很好的库,那也可能有效,但我真的更喜欢Python。
我已经做了大量的谷歌搜索,并在pypi上四处寻找,但还没有找到明显的东西。
相关链接:

@J.F. Sebastian,感谢您提供的链接,我会保留您对我的帖子所做的编辑,但我认为它更适合作为评论而不是帖子编辑。 - Omnifarious
你说得对。这是我从评论不支持链接和无法通过谷歌搜索的时代养成的习惯。 - jfs
5个回答

5

正如Klaus所提到的那样,社区中明确的共识是使用BeautifulSoup来完成这些任务:

soup = BeautifulSoup.BeautifulSoup(html)
for script_elt in soup.findAll('script'):
    script_elt.extract()
html = str(soup)

所有的事件属性怎么办? - Omnifarious
3
转念一想,既然你是为了防止安全问题而这么做的,那你确实需要一个允许标记的白名单。因为绕过黑名单过滤器的方法太多了,容易让不良内容通过。 - Ned Batchelder

4

它们的问题在于几乎所有的标记语言(除了这个网站使用的那个)都有奇怪的特殊情况没有被考虑到。例如,如何加粗和斜体?或者如果你想在链接中引用某些内容怎么办?如果你需要在某个地方使用定界符字符怎么办?这既难看又不明确,也缺乏灵活性。白名单方法听起来像是一个好计划。 - Omnifarious

0
你可以使用BeautifulSoup。它允许你相对容易地遍历标记结构,即使它不是格式良好的。我不知道是否有什么定制的东西只能在脚本标签上工作。

我知道Beautiful Soup,考虑使用它来检查HTML的格式是否正确并进行一些清理。但我希望有一个特定的工具可以删除所有Javascript。 - Omnifarious

0

我会诚实地建议您考虑使用类似于bbcode或其他替代标记语言。


当我遇到它们时,我绝对讨厌那些东西。每个网页似乎都有自己奇怪的变体标记语言,而不是HTML。我憎恶它们所有,特别是因为大多数人没有理性地考虑如何逃脱这些东西或者标记的各种组合方式。我不想增加已经存在的恐怖。 - Omnifarious

0

Eric,

你有没有考虑过使用“SAX”类型的解析器来解析HTML?我不确定它是否能够正确地忽略事件。相比之下,使用类似Beautiful Soup这样的工具会更容易构建。但是,处理语法错误可能会成为SAX的一个问题。

在这种情况下,我喜欢做的事情是从解析后的HTML构建Python对象(从XML_Element类派生)。然后从树中删除任何不需要的对象,最后将对象重新序列化回HTML。在Python中,这并不难。

祝好,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接