当我向我的快递服务器发送PUT
请求时,req.body
有时会有__proto__
属性,有时则不会。{/ p>
使用节点0.10.26并表达3.2.3 :
{"a":"b", "__proto__": {}}
时,req.body
为{"a":"b"}
使用节点4.1.0并表达3.2.3 :
{"a":"b", "__proto__": {}}
时,req.body
为{"a":"b", "__proto__": {}}
因此,较新版本的节点不会删除__proto__
属性。我其实喜欢这种行为;现在我必须编写自己的中间件来剥离属性。我认为这与bodyparser
有关。但奇怪的是,两个测试都具有相同版本的express
(因此版本为bodyparser
)。
任何人都可以给出任何改变原因的动机吗?推荐的解决方法是什么?
答案 0 :(得分:1)
表达和节点都不对此行为负责。对于兼容性和规格一致性,很久以前在 V8 中实际上已经改变了。
旧行为(__proto__
被剥离):
> var x = JSON.parse('{"__proto__":[]}');
> x.hasOwnProperty('__proto__');
false
新行为(__proto__
未被删除):
> var x = JSON.parse('{"__proto__":[]}');
> x.hasOwnProperty('__proto__');
true
来源:
就像你说的那样,你可以编写一个简单的中间件来自己剥离属性:
function stripProto(req, res, next) {
delete req.body.__proto__;
next();
}
// ...
app.use(stripProto);