为什么没有新版本的节点从请求体中删除__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
来源:
- 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);