【问题标题】:symfony2 twig whitelist html tagssymfony2 twig 白名单 html 标签
【发布时间】:2011-11-03 19:22:12
【问题描述】:

我在 Symfony2 中将一个变量传递给我的 twig 模板,这个变量可能包含<br /> html 标签,我试图创建一个扩展(函数),但该变量仍然被转义。

如何输出允许<br /> 标签的twig 变量?是否有一个简单的解决方案只允许某些模板中允许的标签白名单?

我搜索过 twig 沙箱,但我不确定这是否是我的解决方案。

编辑:我仍然希望对变量进行转义,但只允许 <br /> 标记。

【问题讨论】:

    标签: html templates escaping symfony twig


    【解决方案1】:

    其实你可以通过以下方式使用原生PHP函数strip_tags:

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

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

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

    【讨论】:

    • escape 和 striptags 之间的根本区别在于,通过将 替换为 html 实体,escape 将使标签无害,而 striptags 将完全删除标签。因此,如果例如,这将不是一个好策略。您希望允许大多数 HTML 但转义
    • 我也认为这是最好的答案。如果您希望在脚本中允许一些 HTML 但仍保持安全,则需要使用白名单
    • “原始”不是让它在这里不安全吗?
    【解决方案2】:

    你可以这样做:

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

    例如,

    <br>
    

    不会逃跑

    <br> and <br />
    

    和

    <p>
    

    不会逃跑

    <p> and </p>
    

    等等

    【讨论】:

      【解决方案3】:

      最初我认为应该可以编写自定义转义策略,以便您可以执行以下操作:

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

      不幸的是,事实并非如此。唯一可用的策略是 html 和 js。它们在Twig_Extension_Core 类文件中定义的twig_escape_filter() 函数中硬编码。

      看来您唯一的选择是使用新过滤器编写自定义 estension:

      {{ var|raw|customescape }}
      

      这是一个自定义树枝扩展的示例以及如何在 Symfony 中注册它:Symfony2 Twig extension

      【讨论】:

      • 抱歉回复晚了。谢谢。
      • 无需创建自定义 twig 扩展来允许
        标签显示为@Artem L 在下面回答。
      • @gabrielem 剥离 BR 标签如何让它们显示出来?问题是关于将标签列入白名单,而不是将它们列入黑名单。
      • @JakubZalas 通过在 striptags 函数中插入一个标签,您将把它“列入白名单”。并且将显示 BR 标签,没有其他标签。这是该问题的正确答案。您只需要按原样使用功能 striptags 即可。 ;) 以及“Artem L”如何在下面回答。
      • 啊,你是对的。我忘了 strip_tags() 的第二个参数实际上是一个白名单。
      【解决方案4】:
      {{ var|striptags('<br>')|raw }} 
      

      工作正常,但我不知道如何使用此树枝过滤器将数组传递给 strip_tags php 函数。

      两者

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

      和

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

      在渲染模板时抛出“数组到字符串的转换”异常。

      还要小心 strip_tags php 函数不会像“onclick”那样转义 html 属性。

      【讨论】:

        【解决方案5】:
        {{ var|nl2br }}
        

        和/或

        {{ var|raw|nl2br }}
        

        nl2br reference

        【讨论】:

        • 我看不出使用{{ var|raw|nl2br }} 的意义,因为{{ var|raw }} 已经允许使用任何东西(好吧,除了\n)但是{{ var|nl2br }} 的答案非常棒,因为它一直在放置 symfony 的自动转义,但允许轻松添加 &lt;br&gt; +1
        • nl2br 过滤器也是一个不错的答案,当您考虑在字符串中使用换行符而不是 br 标记时。
        猜你喜欢
        • 2013-07-08
        • 2021-10-30
        • 2011-03-07
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 2013-03-12
        相关资源
        最近更新 更多