如果在基于cookies的访问限制的站点上使用AJAX,JavaScript需要访问cookies。HttpOnly Cookie是否可以在AJAX站点上工作
编辑:如果指定了HttpOnly,Microsoft通过禁止JavaScript访问Cookie创建了一种防止XSS攻击的方法。FireFox后来采纳了这一点。所以我的问题是:如果你在一个站点上使用AJAX,比如StackOverflow,Http仅仅是cookies吗
编辑2:问题2。如果HttpOnly的目的是阻止JavaScript访问Cookie,并且您仍然可以通过XmlHttpRequest对象通过JavaScript检索Cookie,HttpOnly的意义是什么
编辑3:以下是维基百科的一段引文:
当浏览器接收到这样的cookie时,它应该在以下HTTP交换中像往常一样使用cookie,但不要让客户端脚本看到它。[32]HttpOnly标志不是任何标准的一部分,也不是在所有浏览器中都实现的。请注意,目前没有阻止通过XMLHTTPRequest读取或写入会话cookie。[33]
我知道当您仅使用HttpOnly时,document.cookie被阻止。但是,您似乎仍然可以读取XMLHttpRequest对象中的cookie值,允许使用XSS。HttpOnly如何让您比以前更安全?通过使cookies本质上是只读的
在您的示例中,我无法写入您的document.cookie,但我仍然可以窃取您的cookie并使用XMLHttpRequest对象将其发布到我的域中
<;script type=“text/javascript”>;
var-req=null;
请尝试{req=newXMLHttpRequest();}catch(e){}
如果(!req)尝试{req=newActiveXObject(“Msxml2.XMLHTTP”);}catch(e){}
如果(!req)尝试{req=newActiveXObject(“Microsoft.XMLHTTP”);}catch(e){}
请求打开('GET','http://stackoverflow.com/",假),;
请求发送(空);
警报(请求getAllResponseHeaders());
</脚本>;
编辑4:对不起,我的意思是您可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,将cookie正则化,然后将其发布到外部域。看来维基百科和哈·克尔斯在这一点上同意我的观点,但我很想接受再教育
最终编辑:啊,显然这两个网站都错了,这实际上是FireFox中的一个bug。IE6&;7实际上是目前唯一完全支持HttpOnly的浏览器
重申我所学到的一切:
- HttpOnly限制对IE7&;中document.cookie的所有访问;和FireFox(不确定其他浏览器)
- HttpOnly从IE7中XMLHttpObject.getAllResponseHeaders()中的响应头中删除cookie信息
- XMLHttpObjects只能提交到其来源的域,因此不会跨域发布cookie
编辑:此信息可能不再是最新的。
是的,仅HTTP Cookie适用于此功能。XmlHttpRequest对服务器的请求仍然会提供给它们
在堆栈溢出的情况下,Cookie将作为XmlHttpRequest请求的一部分自动提供。我不知道堆栈溢出身份验证提供程序的实现细节,但是cookie数据可能会自动用于在比“投票”控制器方法更低的级别上验证您的身份
更一般地说,AJAX不需要cookie。XmlHttpRequest支持(甚至旧浏览器上的iframe远程处理)是技术上需要的全部
但是,如果您希望为支持AJAX的功能提供安全性,那么与传统站点相同的规则也适用。您需要一些方法来识别每个请求背后的用户,而cookies几乎总是达到这一目的的手段
在您的示例中,我无法写入您的document.cookie,但我仍然可以窃取您的cookie并使用XMLHttpRequest对象将其发布到我的域中
XmlHttpRequest不会发出跨域请求(正是因为您提到的各种原因)
您通常可以使用iframe remoting或JSONP注入脚本以将cookie发送到您的域,但由于cookie不可访问,因此HTTP只会再次保护cookie
除非你在服务器端泄露了StackOverflow.com,否则你将无法窃取我的cookie
编辑2:问题2。如果Http Only的目的是阻止JavaScript访问Cookie,并且您仍然可以通过XmlHttpRequest对象通过JavaScript检索Cookie,那么Http Only的意义何在
考虑以下情况:
- 我找到了将JavaScript代码注入页面的途径
- Jeff加载页面,我的恶意JavaScript修改他的cookie以匹配我的cookie
- 杰夫对你的问题给出了极好的回答
- 因为他提交的是我的cookie数据而不是他的,所以答案将成为我的
- 你投票支持“我的”优秀答案
- 我的真实陈述说明了问题所在
使用仅限HTTP的Cookie,第二步是不可能的,从而挫败了我的XSS尝试
编辑4:对不起,我的意思是您可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,将cookie正则化,然后将其发布到外部域。看来维基百科和哈·克尔斯在这一点上同意我的观点,但我很想接受再教育
没错。你仍然可以这样劫持会话。但是,即使XSS黑客攻击你,它也会大大减少能够成功执行的人群
但是,如果您回到我的示例场景,您可以看到仅HTTP成功地切断了依赖于修改客户端cookie的XSS攻击(并非罕见)
这归结为这样一个事实:a)没有一个单一的改进能够解决所有的漏洞,b)没有一个系统能够完全安全。仅HTTP是支持XSS的有用工具
类似地,即使XmlHttpRequest上的跨域限制在防止所有XSS攻击方面不是100%成功,您也永远不会想到删除该限制