You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 22:57:03