是否可以使用代理JavaScript对象来“陷阱”用户,通过在获取信息/数据之前清空对象来查找其属性/值?

uemypmqf  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(142)

简单地说:
我试图在JavaScript对象周围创建一个保护屏障,使用代理为任何形式的检索或操作设置“陷阱”。这些陷阱将要求SessionKey参数被提供有任何这样的对象操纵,否则默认为清除对象的所有信息和属性。
(This当然,SessionKey是用户登录PHP提供的,在成功登录时会发送回来。
如果我没弄错的话,当然我不是这里最资深的程序员,Object只会调用提供了相应SessionKey参数的函数--因为这个Object知道SessionKey。
我不能100%地阻止任何或所有这样的尝试进入我的代码,但也许我可以设置一个“trip”警报,使所有这样的努力都失败。没有会话密钥?没有DOM(.empty()),没有WebServices/API。什么都没有
谢谢你的帮助,我非常感激。

roejwanj

roejwanj1#

你想要的东西真的做不到。你可以创建一个代理来捕获检索/操作调用,但是你不能以任何方式使底层对象私有化。
例如,如果您有对象

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 Package 器。
你可以尝试作为第一步:

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'

相关问题