一个常见的问题是如何将对象从Node.js / Express.js传递到浏览器。可以使用JSON字符串化来执行此操作,但是如果对象包含用户提供的数据,则可以打开脚本注入和其他攻击途径。
此链接中提到的使用Base64的方法是否有缺点?
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?
答案 0 :(得分:2)
使用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对象,它将被炸毁,一切都会变得“安全”。但是,如果由于要将其传递给其他值而将其分配给某个值,则仍然存在潜在的问题。
建议不要先将创可贴放置在注入本身上,而建议先对其进行修复并适当地转义数据,然后再将其传递回客户端或在服务器端进行处理。
有很多库可以帮助您完成此任务
https://www.npmjs.com/package/sanitize https://www.npmjs.com/package/express-sanitizer
这是一篇非常不错的文章,强调了为什么重要的是进行清理,而不仅仅是修补潜在的恶意数据:https://lockmedown.com/5-steps-handling-untrusted-node-js-data/