为什么没有新版本的节点从请求体中删除__proto__?

当我发送PUT请求到我的快递服务器, req.body有时有一个__proto__属性,有时不是。

使用节点0.10.26和expression式3.2.3

  • 当我把{"a":"b", "__proto__": {}}
  • 那么req.body{"a":"b"}

使用节点4.1.0和expression式3.2.3

  • 当我把{"a":"b", "__proto__": {}}
  • 然后req.body{"a":"b", "__proto__": {}} req.body {"a":"b", "__proto__": {}}

所以更新版本的节点不会__proto__属性。 我其实很喜欢这种行为。 现在我必须写我自己的中间件去掉财产。 我认为这与bodyparser 。 奇怪的是,虽然,两个testing都有相同版本的express (以及相同版本的bodyparser )。

任何人都可以给出任何动机,为什么这是改变? build议如何解决这个问题?

快递节点都不对此行为负责。 在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);