为什么不't较新版本的节点从请求主体中删除__proto__

Why don't newer versions of node remove __proto__ from request body?

本文关键字:请求 主体 删除 proto 节点 新版本 为什么不      更新时间:2023-09-26

当我向express服务器发送PUT请求时,req.body有时具有__proto__属性,而其他时候则没有。

使用节点0.10.26并表达3.2.3

  • 当我放置CCD_ 4时
  • req.body{"a":"b"}

使用节点4.1.0并表达3.2.3

  • 当我放置CCD_ 7时
  • req.body{"a":"b", "__proto__": {}}

因此,节点的较新版本不会剥离__proto__属性。我其实很喜欢这种行为;现在,我必须编写自己的中间件,剥离属性。我认为这与bodyparser有关。然而,奇怪的是,两个测试都有相同版本的express(因此bodyparser也是相同版本)。

有人能告诉我们为什么要改变吗?解决此问题的建议方法是什么?

express节点都不对这种行为负责。事实上,早在V8中就已经对其进行了更改,以实现兼容性和规范一致性。

  • 旧行为(剥离__proto__):

    > var x = JSON.parse('{"__proto__":[]}');
    > x.hasOwnProperty('__proto__');
    false
    
  • 新行为(未剥离__proto__):

    > var x = JSON.parse('{"__proto__":[]}');
    > x.hasOwnProperty('__proto__');
    true
    

来源:

  • https://code.google.com/p/chromium/issues/detail?id=115055
  • https://code.google.com/p/v8/issues/detail?id=1310

解决方案:

就像你说的,你可以自己写一个简单的中间件来剥离属性:

function stripProto(req, res, next) {
  delete req.body.__proto__;
  next();
}
// ...
app.use(stripProto);