Twig中的Unescape或html解码(PHP模板)

Eri*_*itz 26 php 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 %}
Run Code Online (Sandbox Code Playgroud)

这将输出这个

<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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

rom*_*ger 52

您可以使用raw过滤器来制作twig渲染原始html

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

{% autoescape %}
    {{ var|raw }} {# var won't be escaped #}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)

  • 和往常一样:| raw时请小心。如果您是原始用户输入,则可以打开XSS的门。 (2认同)

PR *_*ead 14

你应该小心使用| 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

 services:
     ha.twig.custom_extension:
     class: HA\SiteBundle\Twig\CustomExtension
     tags:
         - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

  • 我同意,但这仍然应该是一个考虑因素,例如保护开发人员免受自身侵害。 (2认同)

小智 10

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

{% autoescape false %}
   {{ your_item }}{# your_item won't be escaped #}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用的是 Drupal 8,但 或 均raw不起作用autoscape,则可能会发生这种情况,因为您尝试打印的变量是一个带有保存安全输出(例如过滤器hl2br)的模板的渲染数组。

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

{% autoescape false %}
  {{ item.content['#context']['value'] }}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)