gpt4 book ai didi

javascript - 如何保护全局变量(窗口)不被覆盖

转载 作者:行者123 更新时间:2023-12-02 23:34:07 26 4
gpt4 key购买 nike

我目前正在从事一个安全性非常重要的项目。默认情况下,所有全局变量/属性(例如 Promise 甚至 crypto)都可以被覆盖。

有办法保护它们不被覆盖吗?

示例:

window.crypto.getRandomValues = () => { return [1] }

window.crypto.getRandomValues(new Uint32Array(1))[0] // 1

我的第一个想法是使用 Object.freeze() 来锁定对象,但可以简单地覆盖 Object.freeze 方法,这样它就不会执行任何操作。

我们已经对使用的依赖项进行了非常严格的选择,但我仍然想确保这些变量不会被覆盖。或者至少检测它们是否被覆盖。

最佳答案

免责声明:所有这些只是一个粗略的轮廓,未经彻底测试。我确信还有更多问题需要解决。

<小时/>

freezing window-object 不是选项,这只会导致问题,但也许像 window.crypto 这样的对象?

但是您可以重新定义属性使其不再可更改,即使在窗口对象上也是如此

function freezeProp(target, propertyName) {
const { value, get = () => value, set = () => void 0, ...desc } = Object.getOwnPropertyDescriptor(target, propertyName);
Object.defineProperty(target, propertyName, { ...desc, get, set, configurable: false });
}

freezeProp(window, "crypto");

但只有当您能够确保您是第一个运行的脚本时,这些方法才有效。

如果您有对某些方法的引用,也可以检测它们是否已更改;我们又回到了第一个运行的脚本。

<小时/>

但是如果您不确定全局作用域是否已被破坏,为什么不获取一个新的窗口对象呢?

window.crypto.getRandomValues = () => {
return [1]
};

const secure = (() => {
let iframe = document.createElement("iframe");
document.body.appendChild(iframe);
const contentWindow = iframe.contentWindow;
document.body.removeChild(iframe);
return contentWindow;
})();

var a = window.crypto.getRandomValues(new Uint8Array(1));
console.log(a);

var b = secure.crypto.getRandomValues(new Uint8Array(1));
console.log(b);

关于javascript - 如何保护全局变量(窗口)不被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com