HttpOnly Cookie如何处理AJAX请求?

如果在基于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());
&lt/脚本>

编辑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%成功,您也永远不会想到删除该限制

发表评论