使用setRequestHeader制作xmlhttprequest时,为什么无法设置cookie和set-cookie标头?

jsi*_*ist 34 html javascript cookies xmlhttprequest node.js

我想知道为什么不能使用setRequestHeader 设置cookie头.是否有任何特定原因或只是它们是由浏览器本身添加的,所以这些标题被禁用了?有安全问题吗?

- 编辑

我正在使用node.js并使用该xmlhttprequest模块.以下是测试代码:

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.withCredentials = true;
xhr.setRequestHeader('Cookie', "key=value");
xhr.send(null);
Run Code Online (Sandbox Code Playgroud)

这里我需要设置cookie-header,因为node.js' xmlhttprequest没有显式添加cookie-header(就像浏览器一样).尝试这样做时,xmlhttprequest给出错误" Refused to set unsafe header".

虽然我找到了一个补丁并成功发送了cookie标题.但是想知道为什么禁用它来设置cookie-header?无论我在哪里阅读,发现它是数据完整性和安全性所必需的,但在这种情况下可以违反什么安全性,在哪里都没有提到.我想评估这个数据完整性问题是否对node.js应用程序有效,如果我使用我的补丁.

Man*_*ngh 23

我相信你会完成工作草案并找到

上述标题由用户代理控制,以便控制传输的这些方面.

首先,我们需要了解,这些是作为不同浏览器之间功能互操作性指南的标准.它不是针对浏览器的强制要求,因此浏览器由于不同的原因确实对该标准有不同程度的遵守.

其次,从技术上讲,您可以模拟用户代理,将您的程序视为浏览器,并且可以按照上述标准很好地设置这些值.

最后,意图是禁止覆盖Headers或为某些字段设置标题,例如Content-Length,Cookieethos secure design approach.这是为了阻止或至少试图阻止 HTTP请求走私.


rob*_*lep 14

您可以禁用此行为:

var xhr = new XMLHttpRequest();
xhr.setDisableHeaderCheck(true);
xhr.open(...);
...
Run Code Online (Sandbox Code Playgroud)

  • @MarcelFalliere我们谈的是`node-XMLHttpRequest`库(实现[在这里](https://github.com/driverdan/node-XMLHttpRequest/blob/master/lib/XMLHttpRequest.js#L177)),不是浏览器中的`XMLHttpRequest` :) (5认同)
  • 您好@robertklep,您在地球上找到了`setDisableHeaderCheck`的规格?你能指点我一个博士还是什么?这也不起作用/没有在chrome 22中实现.编辑:它不是canari中的事件 (2认同)
  • 你在跟我开玩笑吗 ?没有XMLHttpRequest.setDisableHeaderCheck(true)这样的功能 (2认同)
  • @ShailendraSinghRajawat,正如我在之前的评论中解释的那样:我的答案与浏览器中的XMLHttpRequest不相关,但与Node.js模块[node-XMLHttpRequest]相关(https://github.com/driverdan/node- XMLHttpRequest /)。OP与此模块有关,我为该特定环境提供了可能的答案,而不是在浏览器中可用的通用答案。 (2认同)

Tod*_*odd 8

众所周知,对于浏览器,需要谨慎管理cookie(以及其他属性)以防止第三方窃取用户会话(或其他数据).这是浏览器的问题,以及访问运行任意Javascript的网站的不受控制的性质.

当然,任意代码执行的风险对于node.js来说是低风险或无风险,因为您只运行您编写的脚本,该脚本可能运行您计划的其他代码.

如果你看一下driverdan的XMLHttpRequest.js的源代码,你会发现:

 // These headers are not user setable.   
 // The following are allowed but banned in the spec:   
 // * user-agent   
 var forbiddenRequestHeaders = [
    "accept-charset",
    "accept-encoding",
    "access-control-request-headers",
    "access-control-request-method",
    "connection",
    "content-length",
    "content-transfer-encoding",
    "cookie",
    "cookie2",
    "date",
    "expect",
    "host",
    "keep-alive",
    "origin",
    "referer",
    "te",
    "trailer",
    "transfer-encoding",
    "upgrade",
    "via"   ];
Run Code Online (Sandbox Code Playgroud)

这回答了你为什么限制特别适用于node.js这个脚本的特定问题 - 编码器遵循规范(尽可能接近),尽管感觉它可能不是node.js中必需的安全预防措施.然而,这个默认安全级别很容易修改.

正如robertklep指出的那样,您可以使用该setDisableHeaderCheck方法禁用此默认预防措施.是的,这个最后一点确实回答了你的问题的答案或做出了重大贡献,因为在你提出的问题中你说:

I have found a patch and successfully able to send the cookie-header
Run Code Online (Sandbox Code Playgroud)

我们现在发现你不需要那个补丁.

祝好运!