代码之家  ›  专栏  ›  技术社区  ›  Thomas

如何使靓汤输出HTML实体?

  •  11
  • Thomas  · 技术社区  · 14 年前

    我正在尝试清理和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。

    < 字符 &lt; >&'" ). 但是 Beautiful Soup documentation 只提到实体的解析,而不是实体的生成。我当然可以换一个 NavigableString

    靓汤为何逃不掉 < (和其他魔术角色)默认情况下,我该如何使它做到这一点?


    lxml.html.clean . 它似乎是在黑名单的基础上工作的,而不是白名单,所以对我来说似乎不太安全。标签可以被列入白名单,但是属性不能,而且它允许太多符合我口味的属性(例如。 tabindex ). 此外,它还提供了一个 AssertionError 在输入端 <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT> . 不好的。

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Jason S    10 年前

    我知道这是3.5年后,你原来的问题,但你可以使用 formatter='html' argument to prettify() , encode() , or decode()

        2
  •  2
  •   llasram    14 年前

    lxml.html.clean.Cleaner 类不允许您提供带有 allow_tags safe_attrs_only