在Chromium中,是否有可能强制XMLHttpRequest不发送cookies?

3

是否有可能强制Chrome在XMLHttpRequest中不发送cookie头?我看到Firefox有一个anon参数,但是在Chrome / Webkit上是否有类似的东西?

1个回答

1
很遗憾,在目前的 WebExtensions 中(包括 Firefox 和 Chrome),没有直接的方法。让我们看看替代方案:
  1. 使用 fetch 替代 XMLHttpRequest
  2. 使用 webRequest API 修改请求头
选项 1 的优点是不需要使用 hack,但缺点是 fetch 目前仍然缺少一些在 XMLHttpRequest 中存在的功能。这是否是一个问题,取决于您具体的示例。
选项 2 需要使用 webRequest API 权限,这需要额外的权限。而且它看起来比应该更加复杂。尽管如此,这是我得到的唯一可用于今天浏览器 (2017 年 11 月) 的方法。
但让我们详细看看这两个选项。 选项 1:fetch 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,该API有一个类似的选项叫做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 是否匹配。当请求完成时,所有监听器都将被删除。(有关更多详细信息,请参见如何获取新请求的 requestId?。)
从我所看到的,它可以工作,但不是非常优雅的解决方案。
摘要:
fetch API:
(+)通过crendentials:'omit'直接的解决方案
(+)新标准,旨在取代XMLHttpRequest (-)当前浏览器尚未支持所有功能(超时、取消)
webRequest API:
(+)适用于今天的浏览器(在Chrome上测试过)
(-)对于一个简单的问题来说,非常复杂的解决方案
(-)需要额外的权限才能使用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接