V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
einsdisp
V2EX  ›  程序员

chrome 扩展开发(MV3), worker 后台发起 fetch 请求,无法设置 Sec-Fetch-xxx 请求头

  •  
  •   einsdisp · 352 天前 · 941 次点击
    这是一个创建于 352 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开发 chrome MV3 扩展程序,需要在 service worker 后台需要对一个网站的主页发起 http 请求,请求需要模拟用户在浏览器标签界面正常访问。

    用户正常访问一个网站时,请求头包含如下特殊字段:

    Sec-Ch-Ua: "......"
    Sec-Ch-Ua-Mobile: ?0
    Sec-Ch-Ua-Platform: "Windows"
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    

    在 worker 后台使用 fetch(url, options),请求头却如下:

    Sec-Fetch-Dest: empty
    Sec-Fetch-Mode: cors
    Sec-Fetch-Site: none
    

    二者明显不一样,网站可以通过请求头 Sec-Ch-xxxsec-fetch-xxx 判断是否是正常访问。 然而尝试设置 fetch 的 options 覆盖 headers

    options.headers = {
      'Sec-Ch-Ua': '......',
      'Sec-Ch-Ua-Mobile': '?0',
      'Sec-Ch-Ua-Platform': '"Windows"',
      'Sec-Fetch-Dest': 'document',
      'Sec-Fetch-Mode': 'navigate',
      'Sec-Fetch-Site': 'none',
      'Sec-Fetch-User': '?1',
    }
    

    并没有用, Sec-Ch-xxxsec-fetch-xxx 这些特殊请求头根本不能设置。

    尝试设置 options.mode = 'navigate',则直接保存。

    请问有任何办法设置这些特殊请求头吗?

    7 条回复    2023-05-12 15:13:09 +08:00
    CLMan
        1
    CLMan  
       352 天前
    根据我的少量的扩展开发经验,扩展提供的 API ,无论是内容脚本还是 worker ,都是受到浏览器安全策略限制的。

    在 worker 进行 fetch 时,浏览器会使用 CORS 的方式来请求数据,我还没测试过设置 permissions 是否有效果。

    至于内容脚本,似乎 cors 是不允许的(不太确定),只能访问同源的资源。

    两者提供的 fetch/ajax api 都是受限的,并不是 local api 那样随意,要想不受限,可能要使用服务端来进行请求转发。
    einsdisp
        2
    einsdisp  
    OP
       352 天前
    打错了,`尝试设置 options.mode = 'navigate',则直接保存。`
    保存 => 报错
    feedcode
        3
    feedcode  
       352 天前
    proxy- 和 sec- 在 W3C Forbidden header name 里
    https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
    CLMan
        4
    CLMan  
       352 天前
    感谢分享,原来这一系列头信息有更专业的术语描述。
    xifangczy
        5
    xifangczy  
       351 天前
    chrome.declarativeNetRequest API 可以修改
    xifangczy
        6
    xifangczy  
       351 天前
    chrome.declarativeNetRequest.updateSessionRules({
    removeRuleIds: [1],
    addRules: [{
    "id": 1,
    "action": {
    "type": "modifyHeaders",
    "requestHeaders": [{
    "header": "Sec-Ch-Ua",
    "operation": "set",
    "value": "test"
    }]
    },
    "condition": {
    "resourceTypes": ["xmlhttprequest"]
    }
    }]
    }, function () {
    // fetch 请求...
    });
    forty
        7
    forty  
       351 天前
    chrome.declarativeNetRequest API 正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1520 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:51 · PVG 00:51 · LAX 09:51 · JFK 12:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.