Javascript 为什么不';更新版本的节点是否从请求正文中删除?
当我向express服务器发送一个Javascript 为什么不';更新版本的节点是否从请求正文中删除?,javascript,node.js,express,body-parser,Javascript,Node.js,Express,Body Parser,当我向express服务器发送一个PUT请求时,req.body有时有一个\uuuu proto\uuu属性,而其他时候没有 使用节点0.10.26和express 3.2.3: 当我把{code>{a:“b”,“{u proto}}}放进去时 然后req.body是{a:“b”} 使用节点4.1.0和express 3.2.3: 当我把{code>{a:“b”,“{u proto}}}放进去时 然后req.body是{a:“b”,“proto:{} 因此,较新版本的node不会剥离\u
PUT
请求时,req.body
有时有一个\uuuu proto\uuu
属性,而其他时候没有
使用节点0.10.26和express 3.2.3:
- 当我把{code>{a:“b”,“{u proto}}}放进去时
- 然后
是req.body
{a:“b”}
- 当我把{code>{a:“b”,“{u proto}}}放进去时
- 然后
是req.body
{a:“b”,“proto:{}
\uuuu proto\uuu
属性。我真的很喜欢这种行为;现在我必须编写自己的中间件来剥离属性。我认为这与bodyparser
有关。然而,奇怪的是,两个测试都有相同版本的express
(因此也有相同版本的bodyparser
)
有人能给出改变的动机吗?解决此问题的建议方法是什么?express和node都不对此行为负责。这实际上在很久以前的V8中就已经更改,以实现兼容性和规范一致性
- 旧行为(
被剥离):\uuuuuuuuuuuuuuuuuu
- 新行为(
未剥离):\uuuuuuuuuuuuuuuu
function stripProto(req, res, next) {
delete req.body.__proto__;
next();
}
// ...
app.use(stripProto);
哦,这就是为什么我的谷歌搜索没有找到任何东西。谢谢你的澄清!Use可以将body解析器作为单独的模块使用。
> var x = JSON.parse('{"__proto__":[]}');
> x.hasOwnProperty('__proto__');
true
function stripProto(req, res, next) {
delete req.body.__proto__;
next();
}
// ...
app.use(stripProto);