【问题标题】:Is it possible to force an XMLHttpRequest not to send cookies in chromium?是否可以强制 XMLHttpRequest 不在铬中发送 cookie?
【发布时间】:2017-11-17 08:21:00
【问题描述】:

是否可以强制 chrome 不在 XMLHttpRequest 上发送 cookie 标头。我看到Firefox有一个anon参数,但是chrome/webkit上有类似的东西吗?

【问题讨论】:

    标签: google-chrome webkit xmlhttprequest


    【解决方案1】:

    不幸的是,目前在 webextensions 中没有直接的方法(在 Firefox 和 Chrome 中)。让我们看看替代方案:

    1. 使用fetch 代替 XMLHttpRequest
    2. 使用webRequest API修改请求标头

    选项 1 的魅力在于它不涉及黑客攻击,但缺点是 fetch 目前仍然缺少 XMLHttpRequest 中存在的一些功能。这是否是一个问题,取决于你的具体例子。

    选项 2 需要使用 webRequest API 的权限,这需要额外的权限。而且它看起来比它应该的更复杂。尽管如此,这是我开始工作的唯一方式,并且可以在当今的浏览器上使用(2017 年 11 月)。

    但让我们详细看看这两个选项。

    选项 1:获取 API 及其限制

    当你提到 Firefox 中的匿名请求时,我确定你的意思是这样的代码:

    let xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
               .createInstance(Components.interfaces.nsIXMLHttpRequest);
    xhr.open('GET', 'http://www.example.com');
    xhr.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_ANONYMOUS;
    xhr.send();
    

    在 Chrome 中使用 XMLHttpRequest 是不可能的,但您今天可以获得的最接近的方法是使用 fetch API 避免发送 cookie,它有一个类似的选项称为 credentials,它可以让您控制是否cookie 是否应包含 ('include') 或不包含 ('omit'):

    fetch('http://www.example.com', { credentials: 'omit' }).then(...);
    

    这将在不设置任何 cookie 的情况下发出 GET 请求。

    XMLHttpRequest 相比,在功能方面仍有一些限制。从我的角度来看,最紧迫的问题是您无法中止以fetch 开头的请求,也无法控制超时。

    有一个新标准支持可中止的fetch(请参阅AbortController API),但目前仅在 Firefox 57 和 Edge 上实现(2017 年 11 月)。它很快就会出现在 Chrome 中,但如果您现在需要该功能,那么等到所有浏览器都支持它可能不是一个选择。

    不过,一旦出现AbortController,我认为它将成为避免发送 cookie 的首选方式。

    选项 2:webRequest API 并手动删除“Cookie”标头

    如果您现在需要一个可行的解决方案,并且您在扩展程序中具有访问 webRequest API 的权限,则可以安装 onBeforeSendHeaders 侦听器并手动删除 Cookie 标头。

    为了得到一个想法,它可能是这样的:

    chrome.webRequest.onBeforeSendHeaders.addListener((details) => {
      return {
        requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie');
      };
    }, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']);
    

    但你必须小心,不要意外修改不相关的请求。在实际实现中,您应该验证details.requestId 是否匹配。为了访问请求 ID,我使用了另一个 onBeforeRequestListener 并验证了请求的 URL 是否匹配。请求完成后,所有侦听器都将再次删除。 (详情请见How to get the requestId of a new request?。)

    据我所知,它可以工作,但不是一个非常优雅的解决方案。

    总结:

    获取 API:

    • (+) 通过crendentials: 'omit' 的直接解决方案
    • (+) 旨在取代XMLHttpRequest 的新标准
    • (-) 当前浏览器尚不支持所有功能(超时、取消)

    webRequest API:

    • (+) 适用于当今的浏览器(在 Chrome 上测试)
    • (-) 一个简单问题的非常复杂的解决方案
    • (-) 需要额外的权限才能使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2017-07-04
      • 2023-04-09
      • 2017-01-02
      • 2023-04-10
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多