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应用程序有效,如果我使用我的补丁.
rob*_*lep 14
您可以禁用此行为:
var xhr = new XMLHttpRequest();
xhr.setDisableHeaderCheck(true);
xhr.open(...);
...
Run Code Online (Sandbox Code Playgroud)
众所周知,对于浏览器,需要谨慎管理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)
我们现在发现你不需要那个补丁.
祝好运!