问题描述
简单地说:
我正在尝试使用代理为任何形式的检索或操作设置“陷阱”,从而在JavaScript对象周围创建保护性屏障。 这些陷阱将要求SessionKey参数随任何此类Object操作一起提供,否则默认清除所有Object的信息和属性。
(此SessionKey当然是用户登录PHP提供的一个,成功登录后会发回。)
如果我有此权利,并且我当然不是这里最资深的编码人员,则该对象将仅调用提供了相应SessionKey参数的函数-因为此对象知道SessionKey。
我不能百分百地阻止任何或所有此类努力进入我的代码,但也许我可以设置一个“行程”警报,使所有此类努力均告失败。 没有SessionKey? 没有DOM(.empty()),没有WebServices / API。 没有。
谢谢您的帮助,非常感谢。
1楼
Ryan Dabler
1
已采纳
2019-03-11 14:47:44
您想要的实际上无法完成。 您可以创建一个代理来捕获检索/操作调用,但不能以任何方式将基础对象设为私有。
例如,如果您有对象
const privateObj = { name: 'John Smith', ssn: '123-45-6789' };
和代理
const proxy = new Proxy(privateObj, {} /* handler for getter/setter traps */);
您可以控制台记录代理以获取如下内容:
[[Handler]]: Object
[[Target]]: Object
[[IsRevoked]]: false
并且您可以展开[[Target]]以查看基础对象的属性。
因此,如果您希望此属性完全私有,则不希望使用代理。
此外,如果用户可以检查代理,则他们可以轻松访问底层对象并在代理陷阱之外对其进行突变。
如果您想真正保护该对象,则最好在函数闭包中对其进行保护,并在该对象周围使用getter / setter包装器。
您可以尝试作为第一步:
const protectObject = (SessionKey, ...objectProps) => {
const protectedObject = { // Do something here to create the object
...objectProps // and its properties you want to protect
};
return {
accessProp(_SessionKey, prop) {
if (_SessionKey !== SessionKey) throw Error("Your session key doesn't match");
return protectedObject[prop];
},
setProp(_SessionKey, prop, val) {
if (_SessionKey !== SessionKey) throw Error("Your session key doesn't match");
protectedObject[prop] = val;
}
};
};
因此,现在您有一个受保护的私有对象:
const privateObj = protectObject('12345', 'John Smith', '7/20/1992', '123-45-6789');
privateObj.accessProp('12345', 1); // '7/20/1992'
privateObj.accessProp('1234', 2); // Uncaught Error: Your session key doesn't match
privateObj.setProp('12345', 1, '7/21/1993');
privateObj.accessProp('12345', 1); // '7/21/1993'