为什么不't较新版本的节点从请求主体中删除__proto__
Why don't newer versions of node remove __proto__ from request body?
当我向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);
相关文章:
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- 如何从请求主体获取结果
- 请求流Get+在Node.js中编辑后的JSON主体
- 如何从请求主体(Javascript)中查看/检索FormData对象
- 为什么不't较新版本的节点从请求主体中删除__proto__
- 缺少草稿消息-javascript Gmail API-如何构建请求的主体
- 使用Chrome扩展修改HTTP请求的响应主体
- 获取http post请求主体AngularJS
- JavaScript访问请求主体
- 如何向CasperJS的thenOpen() POST请求的主体中添加文本
- 在REST服务中,什么时候应该在POST请求中使用json主体?
- 在Node中创建一个url-form-eoncoded的HTTP POST请求,其中请求主体具有非唯一键
- Restangular | CustomPOST:我无法在主体中使用json数据对象进行CORS POST请求
- 如何通过chrome扩展修改请求主体
- 使用cljs-ajax发送ajax请求,其主体键不带冒号
- 跨(子)域AJAX POST请求(带有文件/大主体)
- 在我发送之前,是否有一种方法来检查Node.js https请求的主体