如何从 JSON 对象中删除 __proto__ 属性?
How to remove __proto__ property from a JSON object?
我有以下基于 Node-Express 的功能:
//function on server side
app.get('/loginCheck', loggedCheck, function(req, res) {
var data = {local: {}, facebook: {}};
data.id = req.user._id;
data.local.email = req.user.local.email;
data.local.fname = req.user.local.fname;
data.local.lname = req.user.local.lname ;
data.local.college = req.user.local.college ;
data.local.degree = req.user.local.degree ;
data.year = req.user.year ;
data.mobile = req.user.mobile ;
data.city = req.user.city ;
data.facebook.id = req.user.facebook.id ;
//res.json(data);
var x = {};
x.name = "someName"
res.json(x);
})
以下是客户端发出 ajax 请求的代码:
//function on client side making an ajax request
$.get("/loginCheck",function(data,status){
console.log(data);
});
服务器端之前的代码中,req.user
是mongoose创建的一个mongodb对象。我想要做的是发送数据对象(它具有 req.user
对象的一些选定属性)并将对象作为 JSON 作为响应发送。
变量 x
是自定义创建的变量。
问题是:
当我将 data
对象发送到客户端时,__proto__
属性也会添加到对象中,而当我将 x
发送到客户端时不会发生这种情况。
但是,我不想在客户端使用 __proto__
,因为从一些文章中,我发现 __proto__
.
存在安全问题
我需要有关如何从 data
对象中删除 __proto__
的帮助。
您不需要删除它。它不会导致任何 trouble/problem.
你可以这样使用。
$.each(data, function(k, v) {
console.log(k, v);
});
您只需使用 Object.create(null)
并定义您希望使用的属性即可放弃对象的原型。
var obj = Object.create(null);
Object.defineProperty(obj, {
'foo': {
value: 1,
enumerable: true,
},
'bar': {
value: 2,
enumerable: false
}
});
// or...
obj.foo = 1
obj.bar = 2
/* various checks */
obj instanceof Object; // false
Object.prototype.isPrototypeOf(obj); // false
Object.getPrototypeOf(obj); // null
obj + ""; // TypeError: Cannot convert object to primitive value
'toString' in obj; // false
foo; // 1
obj['bar']; // 2
JSON.stringify(obj); // {"foo":1}
{}.hasOwnProperty.call(obj, 'foo'); // true
{}.propertyIsEnumerable.call(obj, 'bar'); // false
并且在这种方法中,您不再需要检查 obj.hasOwnProperty(key)
for (var key in obj) {
// do something
}
阅读更多:True Hash Maps in JavaScript
MDN:
Object.defineProperty()&
Object.create()
// with __proto__
var obj = {} // equivalent to Object.create(Object.prototype);
obj.key = 'value'
console.log(obj)
// without __proto__
var bareObj = Object.create(null)
Object.defineProperty(bareObj, {
'key': {
value: 'value',
enumerable: false,
configurable: true,
writable: true
}
})
// or... bareObj.key = 'value'
console.log(bareObj)
从服务器发送 __proto__
可以创建一个 JSON 对象,如果密钥被转移到另一个对象而不删除 __proto__
或泄漏敏感数据,该对象可能会破坏事情。
它出现在编码 JSON 中是不寻常的,因为它通常被忽略。这表明其他地方可能存在问题或问题。您正在使用它的库可能会意外泄漏或使用它。在封闭系统中使用它可能没问题,但不应允许它进入或离开系统。
// If is optional.
if('__proto__' in obj)
// This may cause unintended consequences.
delete(obj.__proto__);
在接收数据时,您还应该非常小心它不包含 __proto__
属性。如果该密钥被复制到另一个对象,这可能会导致服务器崩溃或受损。
如果创建您自己的对象,可以使用一些技巧来改变它的行为,例如使用 defineProperty,但这些技巧往往不能完全消除问题。
随便写
String(<put here your data>)
我有以下基于 Node-Express 的功能:
//function on server side
app.get('/loginCheck', loggedCheck, function(req, res) {
var data = {local: {}, facebook: {}};
data.id = req.user._id;
data.local.email = req.user.local.email;
data.local.fname = req.user.local.fname;
data.local.lname = req.user.local.lname ;
data.local.college = req.user.local.college ;
data.local.degree = req.user.local.degree ;
data.year = req.user.year ;
data.mobile = req.user.mobile ;
data.city = req.user.city ;
data.facebook.id = req.user.facebook.id ;
//res.json(data);
var x = {};
x.name = "someName"
res.json(x);
})
以下是客户端发出 ajax 请求的代码:
//function on client side making an ajax request
$.get("/loginCheck",function(data,status){
console.log(data);
});
服务器端之前的代码中,req.user
是mongoose创建的一个mongodb对象。我想要做的是发送数据对象(它具有 req.user
对象的一些选定属性)并将对象作为 JSON 作为响应发送。
变量 x
是自定义创建的变量。
问题是:
当我将 data
对象发送到客户端时,__proto__
属性也会添加到对象中,而当我将 x
发送到客户端时不会发生这种情况。
但是,我不想在客户端使用 __proto__
,因为从一些文章中,我发现 __proto__
.
我需要有关如何从 data
对象中删除 __proto__
的帮助。
您不需要删除它。它不会导致任何 trouble/problem.
你可以这样使用。
$.each(data, function(k, v) {
console.log(k, v);
});
您只需使用 Object.create(null)
并定义您希望使用的属性即可放弃对象的原型。
var obj = Object.create(null);
Object.defineProperty(obj, {
'foo': {
value: 1,
enumerable: true,
},
'bar': {
value: 2,
enumerable: false
}
});
// or...
obj.foo = 1
obj.bar = 2
/* various checks */
obj instanceof Object; // false
Object.prototype.isPrototypeOf(obj); // false
Object.getPrototypeOf(obj); // null
obj + ""; // TypeError: Cannot convert object to primitive value
'toString' in obj; // false
foo; // 1
obj['bar']; // 2
JSON.stringify(obj); // {"foo":1}
{}.hasOwnProperty.call(obj, 'foo'); // true
{}.propertyIsEnumerable.call(obj, 'bar'); // false
并且在这种方法中,您不再需要检查 obj.hasOwnProperty(key)
for (var key in obj) {
// do something
}
阅读更多:True Hash Maps in JavaScript
MDN: Object.defineProperty()& Object.create()
// with __proto__
var obj = {} // equivalent to Object.create(Object.prototype);
obj.key = 'value'
console.log(obj)
// without __proto__
var bareObj = Object.create(null)
Object.defineProperty(bareObj, {
'key': {
value: 'value',
enumerable: false,
configurable: true,
writable: true
}
})
// or... bareObj.key = 'value'
console.log(bareObj)
从服务器发送 __proto__
可以创建一个 JSON 对象,如果密钥被转移到另一个对象而不删除 __proto__
或泄漏敏感数据,该对象可能会破坏事情。
它出现在编码 JSON 中是不寻常的,因为它通常被忽略。这表明其他地方可能存在问题或问题。您正在使用它的库可能会意外泄漏或使用它。在封闭系统中使用它可能没问题,但不应允许它进入或离开系统。
// If is optional.
if('__proto__' in obj)
// This may cause unintended consequences.
delete(obj.__proto__);
在接收数据时,您还应该非常小心它不包含 __proto__
属性。如果该密钥被复制到另一个对象,这可能会导致服务器崩溃或受损。
如果创建您自己的对象,可以使用一些技巧来改变它的行为,例如使用 defineProperty,但这些技巧往往不能完全消除问题。
随便写
String(<put here your data>)