一种逆转所有原型重新定义的方法?
A way to reverse all prototype re-definitions?
假设我不信任访问我网站的浏览器。例如,如果他们覆盖 XMLHttpRequest.prototype
并重定向或更改请求怎么办。有什么办法可以防止这种情况发生吗?也许通过在加载结束时将所有对象重置为“出厂设置”?
如果您的脚本一开始 运行,您可以保存对您需要的任何内容的引用,如下所示 & freeze 它。
(() => {
const XHR = XMLHttpRequest;
Object.freeze(XHR);
// use XHR here ...
)();
否则,我认为除了检查函数是否是本机函数之外无法确定 - 转换为字符串 (function + '')
应该表明它是本机函数。
并且 运行针对此功能进行一些简单的单元测试以确保它没问题。
运行 单元测试可能是必要的,以确保函数之间是否没有相互改变(仍然保持原生)。
const alertRef = alert;
alert = console.log;
console.log = alertRef;
另一个可能有用的选项是检查函数 length
属性,它定义了它接受多少参数。
请注意这一点,因为它在不同的浏览器中可能会有所不同。
假设我不信任访问我网站的浏览器。例如,如果他们覆盖 XMLHttpRequest.prototype
并重定向或更改请求怎么办。有什么办法可以防止这种情况发生吗?也许通过在加载结束时将所有对象重置为“出厂设置”?
如果您的脚本一开始 运行,您可以保存对您需要的任何内容的引用,如下所示 & freeze 它。
(() => {
const XHR = XMLHttpRequest;
Object.freeze(XHR);
// use XHR here ...
)();
否则,我认为除了检查函数是否是本机函数之外无法确定 - 转换为字符串 (function + '')
应该表明它是本机函数。
并且 运行针对此功能进行一些简单的单元测试以确保它没问题。
运行 单元测试可能是必要的,以确保函数之间是否没有相互改变(仍然保持原生)。
const alertRef = alert;
alert = console.log;
console.log = alertRef;
另一个可能有用的选项是检查函数 length
属性,它定义了它接受多少参数。
请注意这一点,因为它在不同的浏览器中可能会有所不同。