Backbone.js 木偶模板助手正在转义html字符

Backbone.js 木偶模板助手正在转义html字符,backbone.js,marionette,Backbone.js,Marionette,我有一个视图,它的模型包含一个小数组。我想输出包装在自己的数组项中的每个数组项,但是当在模板中使用模板帮助器时,我将得到转义的html字符,并将其输出为 有没有办法防止这种情况发生 templateHelpers: function () { return { tagsHelper: function(){ var t = ""; this.tags.forEach(function(tag) { t+=

我有一个视图,它的模型包含一个小数组。我想输出包装在自己的数组项中的每个数组项,但是当在模板中使用模板帮助器时,我将得到转义的html字符,并将其输出为

有没有办法防止这种情况发生

templateHelpers: function () {
    return {
      tagsHelper: function(){
        var t = "";
        this.tags.forEach(function(tag)
        {
            t+="<span>"+tag+"</span>";
        });
        return t;
      },
    }
},


我能够使用一种不同的方法,使用一个模板内逻辑块,让它工作,但我仍然非常想知道如何修复最初的问题,以防我发现自己将来需要使用templateHelpers

<script type="text/template" id="font-list-item">
  <td class="alias"><%- name %></td>
  <td class="tags">
    <% tags.forEach(function(tag){ %>
        <span><%= tag %></span>
    <% }); %>
  </td>
</script>
木偶网使用幕后渲染其模板。此模板系统支持两种打印变量的方式:

将输出转义的变量 将输出变量unscaped 在第一个示例中,您使用的是转义字符,它将输出如下字符:

像 &as&; 等 为了能够在示例中使用templateHelper,您应该将标记Shelper呈现为,因为它包含不应转义的HTML

但是,在某些情况下,在呈现未被替换的变量时,应该注意可能的XSS攻击。因此,最好确保变量本身被转义。您的示例可以改写为:

templateHelpers: function () {
  return {
    tagsHelper: function(){
      var t = "";
      this.tags.forEach(function(tag) {
        // note the _.escape(..) below
        t += "<span>" + _.escape(tag) + "</span>";
      });
      return t;
    }
  }
}

但是,我建议您使用第二种解决方案,在模板中使用html标记,因为在模板中键入html更有意义:-注意标记本身应该转义,因此使用语法

感谢您指出我模板中的一个明显漏洞!我以前注意到,有一些教程使用了其中一种,但对于一个无害的角色来说,这是一个非常显著的区别。我想是的。哎呀!
templateHelpers: function () {
  return {
    tagsHelper: function(){
      var t = "";
      this.tags.forEach(function(tag) {
        // note the _.escape(..) below
        t += "<span>" + _.escape(tag) + "</span>";
      });
      return t;
    }
  }
}