为什么较新版本的节点不会从请求体中删除__proto__?

时间:2015-11-30 16:27:30

标签: javascript node.js express body-parser

当我向我的快递服务器发送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)。

任何人都可以给出任何改变原因的动机吗?推荐的解决方法是什么?

1 个答案:

答案 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);