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