【问题标题】:Proper way to interpolate JSON in Express/Jade?在 Express/Jade 中插入 JSON 的正确方法?
【发布时间】:2015-05-05 20:34:16
【问题描述】:

这似乎是旧框架(Django、Rails)中已解决的问题,但我终生无法在 Express 中找到解决方案。

单页 webapps 中一个超级常见的模式是使用模板数据创建 html,然后将相同的数据作为 JSON 回显到客户端,以便它可以维护状态。

each comment as comments
  div= comment

script.
  var comments = !{JSON.stringify(comments)}

显然这是不安全的,因为用户可以轻松创建关闭脚本标签并执行各种讨厌的评论。那么处理这个问题的正确方法是什么?

我见过有人声称你可以过得很好

JSON.stringify(comments).replace(/<\//g, '<\/')

但这似乎很幼稚,尤其是在与健忘的大型团队合作时。

同样,我写了一个函数,它在字符串化之前递归地转义 html,但是在每个字符串中用 &amp;quot; 替换 " 似乎有点矫枉过正,不利于数据绑定。

编辑

供参考,这里是Django的解决方案https://docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs

【问题讨论】:

    标签: javascript node.js express pug


    【解决方案1】:

    如果我理解正确,您是在问如何清理用户输入以防止内容注入攻击、XSS 等。

    至少有 3 个现有的 Express 中间件包,您可以看看这类东西。 express-validator 有一些清理功能。它反过来使用node-validator。当前版本的node-validator 不做XSS 清理,请参阅下面的express-sanitizer

    备受喜爱的 helmet 中间件具有一些 XSS 保护功能,可以满足您的部分或全部需求。如果您正在编写 Express 应用程序并且完全关心安全性,那么如果您还不知道的话,您绝对应该查看 helmet

    有一个名为 express-sanitizer 的 Express 中间件模块。它似乎是最近的并且只有一个贡献者,因此请检查代码以查看它是否满足您的需求并且看起来很成熟。但是现在node-validator 不再这样做了,它正在尝试进行 XSS 清理。 (参见上面的express-validator。)

    【讨论】:

    • 嘿,谢谢!在我们的例子中,我们希望接受任意字符串作为输入,所以我宁愿转义输出而不是清理输入。一篇文章可以包含一个代码示例,并且很好地包含一个善意的“”实例。我将在上面链接的 Django 解决方案是 docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs 。似乎 express-sanitizer 可以做到这一点,但我必须阅读 Caja。
    • 听起来您可能想查看另一个问题的答案:stackoverflow.com/a/7124052/436641
    • 看起来这个答案可以替代“escape”而不是“escapejs”。如果可以的话,我可能只是查看代码并在 JS 中复制它。
    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2016-09-15
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多