当前位置: 代码迷 >> JavaScript >> 是否可以使用代理JavaScript对象通过清空对象优先级以获取信息/数据来“诱捕”用户查找其属性/值?
  详细解决方案

是否可以使用代理JavaScript对象通过清空对象优先级以获取信息/数据来“诱捕”用户查找其属性/值?

热度:75   发布时间:2023-06-05 14:23:39.0

简单地说:

我正在尝试使用代理为任何形式的检索或操作设置“陷阱”,从而在JavaScript对象周围创建保护性屏障。 这些陷阱将要求SessionKey参数随任何此类Object操作一起提供,否则默认清除所有Object的信息和属性。

(此SessionKey当然是用户登录PHP提供的一个,成功登录后会发回。)

如果我有此权利,并且我当然不是这里最资深的编码人员,则该对象将仅调用提供了相应SessionKey参数的函数-因为此对象知道SessionKey。

我不能百分百地阻止任何或所有此类努力进入我的代码,但也许我可以设置一个“行程”警报,使所有此类努力均告失败。 没有SessionKey? 没有DOM(.empty()),没有WebServices / API。 没有。

谢谢您的帮助,非常感谢。

您想要的实际上无法完成。 您可以创建一个代理来捕获检索/操作调用,但不能以任何方式将基础对象设为私有。

例如,如果您有对象

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'
  相关解决方案