浏览器全局JavaScript对象是否完全可修改?如何判断fetch为原生实现?
关于浏览器全局JavaScript对象与原生fetch判断的相关问题解答
1. 浏览器全局JavaScript对象是否完全可修改?
绝大多数浏览器内置的全局对象和API默认都是可修改的,只有极少数被浏览器配置为writable: false、configurable: false的属性无法被覆写或删除,比如window.location的部分核心属性。类似fetch、console.log、setTimeout这类常用API默认都是可写的,开发者可以直接覆写全局的实现。
2. 判断fetch是否为浏览器原生实现的方法
常用的判断方案有两种:
- 利用原生函数的
toString特征:原生函数调用toString()会返回包含[native code]的字符串,为了避免被覆写的toString方法欺骗,可以直接调用Function原型上的原始toString方法:
function isNativeFetch() { return Function.prototype.toString.call(window.fetch).includes('[native code]') }
该方法存在局限性,如果攻击者修改了Function.prototype.toString本身,判断结果就不可信。
- 从干净的执行上下文获取原生实现:创建一个临时的、未被页面脚本污染的iframe,从iframe的全局对象中获取原生fetch,该方法的可信度更高:
function getNativeFetch() { const iframe = document.createElement('iframe') iframe.style.display = 'none' document.body.appendChild(iframe) const nativeFetch = iframe.contentWindow.fetch document.body.removeChild(iframe) return nativeFetch }
3. 能否通过Window原型访问原生fetch?Window原型是否可修改?
在未被篡改的正常场景下,window.fetch本身继承自Window.prototype.fetch,二者为同一个引用。但Window.prototype本身也是可修改的,如果攻击者连Window.prototype.fetch都一起覆写,就无法通过原型链拿到原生的fetch实现。
注意:如果页面已经被恶意脚本完全控制,不存在100%可靠的原生API获取方案,所有判断逻辑都存在被篡改的可能。
内容的提问来源于stack exchange,提问作者10101
相关产品推荐
相关产品推荐

