绕过html5lib / bleach中特定的HTML净化

1 投票
2 回答
624 浏览
提问于 2025-04-18 05:44

我正在使用 bleach,它利用 html5lib 来清理用户生成的内容,这些内容是作为 dust.js 模板设计的 HTML 片段。

一切都运行得很好,除了这种情况——

输入:

<table>
    {#loop}
      <tr>
         <td>{name}</td>
      </tr>
    {/loop}
</table>

输出:

    {#loop}
    {/loop}
<table>
      <tr>
         <td>{name}</td>
      </tr>
</table>

循环标签被放在了表格外面。这是有道理的——因为 html5lib 正在修正我的 HTML;内容不应该直接放在表格结构里,除非它被包裹在 td/th 标签中。我通常希望能进行这样的修正,并且仍然希望能进行修正——但我在想有没有办法让这些标签通过。

有没有人遇到过类似的情况,并且能够抑制这种清理行为?

到目前为止,我想到的唯一方法是把控件包裹在一个我可以用正则表达式去掉的标签里:

<table>
    <tr data-layout=""><td>{#loop}</td></tr>
      <tr>
         <td>{name}</td>
      </tr>
    <tr data-layout=""><td>{/loop}</td></tr>
</table>

这个方法的问题是,一旦我用正则表达式去掉这个格式化的“黑科技”,我就很难再把它加回来了。编码后的模板变得无法编辑。

2 个回答

-1

Bleach 这个工具自带了一些安全的标签和属性,也就是所谓的白名单。不过,你可以添加新的标签或者修改已有的白名单标签和属性。下面是一个例子,教你怎么给现有的白名单添加自定义标签:

bleach.ALLOWED_TAGS.extend( ['{#*}' , '{/*}' ] )

简单来说,Bleach 会把 "{#loop} {/loop}" 这些标签标记为安全的,可以放心使用。

** Bleach 的 官方文档 里有详细的说明,教你怎么定义通配符的白名单标签和属性。

1

这跟数据清理没关系,主要是关于解析(按照规范来做的!)。“寄养父母”是指HTML解析器如何处理表格元素中的大部分内容;如果想要改变这个行为,就得修改html5parser.py里的解析器。html5lib的目标是实现一个符合规范的HTML解析器——它没有提供让解析器不符合规范的接口。

撰写回答