繁体   English   中英

如何从 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.userreq.user创建的 mongodb 对象。 我想要做的是发送数据对象(它具有req.user对象的一些选定属性)并将对象作为 JSON 作为响应发送。

变量x是自定义创建的变量。

问题是:当我将data对象发送到客户端时, __proto__属性也被添加到我将x发送到客户端时没有发生的对象。 但是,我不想在客户端使用__proto__ ,因为从一些文章中,我发现__proto__存在安全问题。

我需要有关如何从data对象中删除__proto__帮助。

您可以简单地通过使用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
}

阅读更多: 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)

你不需要删除它。 它不会造成任何麻烦/问题。

你可以这样使用。

$.each(data, function(k, v) {
    console.log(k, v);
});

从服务器发送__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>)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM