Symfony2 Twig白名单HTML标签

12
我在Symfony2的twig模板中将变量传递给模板,这个变量可能包含<br /> html标签,我尝试创建一个扩展(函数),但变量仍然被转义。
如何输出允许使用<br />标签的twig变量?是否有一种简单的解决方案只允许在某些模板中使用白名单中允许的标签?
我已经查找了有关twig沙箱的信息,但我不确定那是否是我的解决方案。
编辑:我仍希望变量被转义,但仅允许使用<br />标签。
5个回答

44

实际上,你可以通过以下方式使用PHP的本地函数strip_tags:

{{ var|striptags('<br>')|raw }}

你可以使用以下代码允许多个标签:

{{ var|striptags('<br><p>')|raw }}

1
在转义和去除标签之间存在根本性的区别,转义将通过替换<>为HTML实体使标签变得无害,而去除标签将完全删除标签。因此,如果您想允许大多数HTML但转义<script>标签,则这不是一个好策略。 - Jens Wegar
1
我也认为这是最好的答案。如果你想在脚本中允许一些HTML但仍然保持安全,你需要使用白名单。 - cw24
1
“raw” 在这里不会使它不安全吗? - datasn.io

3
你可以这样做:
{{ text | striptags('<p><b><br') | raw }}

例如,
<br>

不会转义

<br> and <br />

并且
<p>

不会转义

<p> and </p>

etc.


1

最初我认为应该可以编写自定义转义策略,这样你就可以做到像这样:

{{ var|escape('html-custom') }}

很遗憾,情况并非如此。唯一可用的策略是html和js。它们在twig_escape_filter()函数中进行硬编码,该函数定义在Twig_Extension_Core类文件中。

看起来你唯一的选择是编写一个新过滤器的自定义扩展:

{{ var|raw|customescape }}

这是一个关于自定义Twig扩展的例子,以及如何在Symfony中注册它:Symfony2 Twig extension

1
抱歉回复晚了。谢谢。 - jonv1
无需创建自定义twig扩展程序,即可像@Artem L下面的答案所述,让<br>标签显示。 - gabrielem
@gabrielem,去掉BR标签后如何显示它们?问题是关于白名单标签而不是黑名单标签。 - Jakub Zalas
通过在striptags函数中插入标签,您将对其进行“白名单”处理。BR标签将被显示,没有其他标签。这是问题的正确答案。您只需要按原样使用striptags函数即可。 ;) 还有像“Artem L”所回答的那样。 - gabrielem
啊,你说得对。我忘记了 strip_tags() 的第二个参数实际上是一个白名单。 - Jakub Zalas

0

我认为使用{{ var | raw | nl2br }}没有意义,因为 {{ var | raw }}已经可以使用任何东西(除了\n)但是答案{{ var | nl2br }}很棒,因为它保留symfony的自动转义功能,同时又轻松添加<br> - Kamil Dziedzic
nl2br过滤器也是一个不错的选择,当您考虑在字符串中使用换行符而不是br标签时。 - SenseException

0
{{ var|striptags('<br>')|raw }} 

代码运行良好,但我不知道如何使用这个Twig过滤器将数组传递给strip_tags PHP函数。

两者都可以。

{{ var|striptags(['<br>', '<b>'])|raw }}

并且

{% set allow = ['<br>', '<b>'] %}
{{ var|striptags(allow)|raw }}

在模板渲染过程中抛出“将数组转换为字符串”异常。

同时要注意,PHP函数strip_tags不会转义像"onclick"这样的HTML属性。


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