一种逆转所有原型重新定义的方法?

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 属性,它定义了它接受多少参数。 请注意这一点,因为它在不同的浏览器中可能会有所不同。