【问题标题】:Unescape or html decode in Twig (PHP Templating)Twig 中的 Unescape 或 html 解码(PHP 模板)
【发布时间】:2013-03-16 19:17:24
【问题描述】:

我使用的是 twig 1.12.2。我的代码从代码隐藏中生成了一些元素,当使用最新版本的 twig 渲染这些元素时,它们会得到 html 编码

{% for item in files_folders %}
<tr class="{{ cycle(['tr_odd', 'tr_even'], loop.index) }}">
    <td><img src="../templates/images/sharepoint/{{ item.ContentType }}.gif" border="0" alt=""/></td>
    <td>{{ item.Link }}</td>
    <td>{{ item.Modified }}</td>
    <td>{{ item.FileSize }}</td>
    <td>{{ item.FileType }}</td>
</tr>
{% endfor %}

这会输出这个

<tr class="tr_even">
    <td><img src="../templates/images/sharepoint/Document.gif" border="0" alt=""/></td>
    <td>&lt;a href=&#039;?download=/ddd.png&#039;&gt;ddd.png&lt;/a&gt;</td>
    <td>2013-03-04 17:47:38</td>
    <td>64.8 KB</td>
    <td>png</td>
</tr>
<tr class="tr_odd">
    <td><img src="../templates/images/sharepoint/Document.gif" border="0" alt=""/></td>
    <td>&lt;a href=&#039;?download=/asdasd.png&#039;&gt;asdasd.png&lt;/a&gt;</td>
    <td>2013-03-03 20:01:52</td>
    <td>66.04 KB</td>
    <td>png</td>
</tr>

当我在发送到树枝之前调试并查看数据时,它不会被转义。我还没有找到 {{ item.Link }} 的任何替代方法来按原样呈现数据。

谢谢

【问题讨论】:

    标签: php twig


    【解决方案1】:

    您可以使用raw 过滤器使 twig 呈现原始 html

    http://twig.sensiolabs.org/doc/filters/raw.html

    {% autoescape %}
        {{ var|raw }} {# var won't be escaped #}
    {% endautoescape %}
    

    【讨论】:

    • 好的答案 +1 但是,请提供一个示例以确保您的答案保持相关性,因为链接可能会die 或丢失。
    • 一如既往:使用 |raw 时请小心。如果您是原始用户输入,则为 XSS 打开了大门。
    【解决方案2】:

    如果您使用 Drupal 8 并且 rawautoscape 均无效,则可能是因为您尝试打印的变量是带有模板的渲染数组,其中包含安全输出(例如, hl2br 过滤器)。

    在这种情况下,您需要通过渲染数组访问该值并对其进行过滤,例如:

    {% autoescape false %}
      {{ item.content['#context']['value'] }}
    {% endautoescape %}
    

    【讨论】:

      【解决方案3】:

      http://twig.sensiolabs.org/doc/filters/raw.html

      {% autoescape false %}
         {{ your_item }}{# your_item won't be escaped #}
      {% endautoescape %}
      

      【讨论】:

        【解决方案4】:

        您应该小心使用 |raw。说数据是安全的,意味着您 100% 信任它。

        我个人建议使用自定义树枝过滤器:

        class CustomExtension extends \Twig_Extension 
        {
            public function getFilters()
            {
                return array(
                    new \Twig_SimpleFilter('unescape', array($this, 'unescape')),
                );
            }
        
            public function unescape($value)
            {
                return html_entity_decode($value);
            }
        }
        

        将以下内容添加到您的 services.yml(或转换为 xml)。

         services:
             ha.twig.custom_extension:
             class: HA\SiteBundle\Twig\CustomExtension
             tags:
                 - { name: twig.extension }
        

        【讨论】:

        • 这很优雅,但在不是社区或面向公众的网站的应用程序中,100% 的信任并不是真正的问题 :)
        • 我同意,但它仍然应该是一个考虑因素,例如保护开发人员免受自己的伤害。
        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 2014-07-14
        • 2012-12-25
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多