【发布时间】:2017-11-17 08:21:00
【问题描述】:
是否可以强制 chrome 不在 XMLHttpRequest 上发送 cookie 标头。我看到Firefox有一个anon参数,但是chrome/webkit上有类似的东西吗?
【问题讨论】:
标签: google-chrome webkit xmlhttprequest
是否可以强制 chrome 不在 XMLHttpRequest 上发送 cookie 标头。我看到Firefox有一个anon参数,但是chrome/webkit上有类似的东西吗?
【问题讨论】:
标签: google-chrome webkit xmlhttprequest
不幸的是,目前在 webextensions 中没有直接的方法(在 Firefox 和 Chrome 中)。让我们看看替代方案:
fetch 代替 XMLHttpRequest选项 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:
【讨论】: