我正在运行一些我的访问者使用twig通过htmlpurifier创建的模板,但它一直在尝试修复html代码。
我以此为例:
<ul>
{% for update in jobupdates %}
<li>
{{ update.comment|nl2br }}
</li>
{% endfor %}
</ul>
它将把它变成:
<ul><li>
{% for update in jobupdates %}
</li><li>
{{ update.comment|nl2br }}
{% endfor %}
</li></ul>
完全打破了这一切。 我试过设置选项&#39; HTML.TidyLevel&#39;没有,但它仍然这样做。
有没有办法阻止htmlpurifier尝试修复HTML代码?或忽略twig语法?
答案 0 :(得分:2)
你的问题基本上归结为HTML Purifier旨在消毒HTML,而你正在提供它,一种模板标记语言Twig。它包含一些HTML,但这与 HTML不同(就像HTML可以包含纯文本,但不是一回事作为明文)。
它正在做你正在观察的事情的原因是,HTML净化器在消毒部门中的大部分优势来自于严格控制HTML的结构。这样,依赖于超出标准的浏览器中的实现细节的漏洞(例如在这种情况下如何处理无序列表中的文本(<ul>
),而不是列表项(<li>
))也得到了处理,减少了攻击面。
在这种特殊情况下,通过允许这个星座来破坏任何东西的可能性很小,可以忽略不计,但人们可以想象其他重要的星座(例如想象有人写<img>some payload here</img>
- HTML中的感觉,我知道现在没有任何漏洞,看起来像这样,但可以想象一个浏览器试图变得聪明起来。)
无论哪种方式,它都是HTML Purifier的一个组成部分,您不能简单地将其关闭,因为所有的卫生规则HTML Purifier基本上都存在 on 的格式良好的HTML,因为上述原因。
根据倒数第二个用于卫生的用例,解决方案可能很简单,只需在之后将模板转换为HTML,但之前 em>结果显示在页面上。这具有净化例如净化的附加益处。注入模板的注释。
那就是说,这可能与你实际希望实现的目标无关。
如果您想要做的只是整理模板中的HTML而不是清理它,您可能需要查看其他工具。我没有使用只是整理HTML的工具的经验,他们可能有相同的缺点(即使只是想产生有效的HTML会产生这种效果 - 但也许有一些工具只能缩进标记并修复明显的标记错误,例如删除某处的迷路</img>
。
如果您想清理 HTML,您也可以尝试使用其他工具。看看http://htmlpurifier.org/comparison的一些想法?
您可以分叉HTML Purifier并更改其对HTML的理解。如果您帖子中的示例没有很多堂兄弟,那么这实际上是可行的,即如果没有很多完全不同的星座,那么对格式良好的HTML的坚持就会受到阻碍。在您提到的示例中,这可能需要深入研究HTMLPurifier_HTMLModule_List
和HTMLPurifier_ChildDef_List
的内容,特别是后一类else
中的validateChildren()
- 块,但我有现在没有概念证明。
请记住,您在此处所做的事实上是将HTML Purifier工作的HTML定义转换为基本的Twig定义。这不仅可能有很多工作(取决于你想教多少),它可能实际上并不是你想要做的。
我建议问自己几个问题并根据答案采取行动(括号中的信息作为这些行动的指南存在,其中的想法不详尽无遗):
您可以自问其他问题,但我希望这些问题提供了一个有用的起点。