是否有可能强制XMLHttpRequest不发送铬的cookie?

时间:2015-04-29 11:40:16

标签: google-chrome webkit xmlhttprequest

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

    选项1:获取API及其限制

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

    XMLHttpRequest

    在Chrome中使用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(); 是不可能的,但您今天最接近的事情是避免使用fetch API发送Cookie,credentials有一个名为AbortController API的类似选项,可让您控制是否应包含Cookie(XMLHttpRequest)或不包括'include'):

    'omit'

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

    fetch('http://www.example.com', { credentials: 'omit' }).then(...); 相比,在功能方面仍存在一些限制。从我的角度来看,最紧迫的问题是你无法中止以XMLHttpRequest开头的请求,也无法控制超时。

    有一项新标准可支持中止fetch(请参阅onBeforeSendHeaders),但目前仅在Firefox 57和Edge(2017年11月)上实施。它很快就会进入Chrome,但如果您现在需要这些功能,则可能无法等到所有浏览器都支持它。

    但是,一旦fetch存在,我认为它将成为避免发送cookie的首选方式。

    选项2:webRequest API并删除' Cookie'手动标题

    如果您现在需要有效的解决方案,并且您在扩展程序中有权访问webRequest API,则可以安装onBeforeRequestListener侦听器并手动删除AbortController标题。

    要想出一个主意,这就是它的样子:

    Cookie

    但是你必须要小心,不要意外地修改不相关的请求。在实际实现中,您应该验证chrome.webRequest.onBeforeSendHeaders.addListener((details) => { return { requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie'); }; }, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']); 是否匹配。为了访问请求ID,我使用了另一个How to get the requestId of a new request?并验证了请求的URL是否匹配。请求完成后,将再次删除所有侦听器。 (有关详细信息,请参阅{{3}}。)

    从我看来,它起作用但它不是一个非常优雅的解决方案。

    <强>要点:

    获取API:

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

    webRequest API:

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