【问题标题】:Stop nunjucks from escaping HTML阻止 nunjucks 转义 HTML
【发布时间】:2015-04-25 13:51:02
【问题描述】:

我有一个 cmets AJAX 调用,它返回已发布评论的数据,我还内置了 @mention 功能,服务器端正在处理 @mentions 并对提到的用户执行 str_replace 用 a 替换他们的名字响应中的标签,例如:

{
   data: {
      comment: "<a href=\"profile/derp\">Username</a> hey what's up"
   }
}

但是我似乎无法在文档中找到如何允许 nunjucks 将其打印为实际的 HTML,它会将其转义并显示代码,而不是让它成为真正的标签。

有谁知道我怎样才能让它打印为实际的 a 标签?

【问题讨论】:

    标签: javascript template-engine nunjucks


    【解决方案1】:

    好吧,在我发布这篇文章后,我几乎立即找到了答案!对于其他人来说,这就是这个;在您打印变量的模板中添加安全过滤器,这将禁用自动转义。

    {{ comment.content|safe }}
    

    虽然这意味着它容易受到XSS injection 的攻击,但请确保在服务器端添加保护。

    【讨论】:

    • 这让我很震惊,因为当我最初看到过滤器时,我认为它是 相反的——保险箱会转义 HTML。
    • 你救了我:)
    【解决方案2】:

    您还可以使用以下方法避免全局转义:

    nunjucks.configure({ autoescape: false });
    

    【讨论】:

    • 虽然你几乎不想这样做。
    【解决方案3】:

    您可以考虑传递评论的元数据并让模板创建 HTML:

    <p>
      <a href="{{ comment.user.url }}">{{ comment.user.name }}</a> {{ comment.text }}
    </p>
    

    然后传递以下元数据:

    comment: {
      user: { url: "profile/derp", name: "Username" },
      text: "hey what's up"
    }
    

    【讨论】:

    • 感谢您的建议,但问题是模板事先不知道是否会有链接,因为此链接仅在有提及时才添加,例如可以在评论中.
    • @AndréFigueira 您可以添加条件语句。
    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多