代码之家  ›  专栏  ›  技术社区  ›  prototype

在Node.js/express中安全地将对象传递给客户端

  •  1
  • prototype  · 技术社区  · 6 年前

    一个常见的问题是如何将对象从Node.js/Express.js传递到浏览器。使用JSON stringify可以做到这一点,但如果对象包含用户提供的数据,则可能会打开脚本注入和其他攻击的大门。

    https://stackoverflow.com/a/37920555/645715

    相关链接:

    Passing an object to client in node/express + ejs?

    How to pass a javascript object that contains strings with quotes from node.js to the browser?

    Pass a NodeJS express object to AngularJS 1.6

    在node/express+ejs中将对象传递给客户机?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Matti Price    6 年前

    使用Base64编码确实解决了返回注入攻击的直接问题,但它不一定解决了可能存在的注入攻击的问题。例如,此小提琴显示它确实可以防止立即出现的问题: https://jsfiddle.net/9prhkx74/

    var test2 = JSON.parse(window.atob('PC9zY3JpcHQ+PHNjcmlwdD5hbGVydCgndGVzdDInKTwvc2NyaXB0PjxzY3JpcHQ+'));
    

    这不会显示警报框,只会抛出一个关于无效JSON的错误。但如果将其更改为文本字符串,则会显示警报框(注入易受攻击)

    var test2 = JSON.parse("</script><script>alert('test2')</script><script>")
    

    现在,如果您立即将其解析为JSON对象,它将爆炸,一切都将“安全”。但是如果你将它赋给一个值,因为你将要传递更多的值等等,你仍然有一个潜在的问题。

    我建议在将数据传递回客户端或在服务器端进行处理之前,首先修复它并正确地转义数据,而不是在注射本身上使用bandaid。

    有很多图书馆可以帮助我们做到这一点

    https://www.npmjs.com/package/sanitize https://www.npmjs.com/package/express-sanitizer

    这里有一篇相当不错的文章,重点介绍了为什么必须进行清理,而不仅仅是修补潜在的恶意数据: https://lockmedown.com/5-steps-handling-untrusted-node-js-data/