如果在基于cookie的访问限制的网站上使用AJAX,则JavaScript需要访问cookie。HttpOnly cookie可以在AJAX网站上使用吗?
编辑: Microsoft创建了一种方法,通过在指定HttpOnly的情况下禁止对cookie的JavaScript访问来防止XSS攻击。FireFox后来采用了此方法。所以我的问题是:如果您在像StackOverflow这样的网站上使用AJAX,是否可以选择仅使用Http的cookie?
编辑2:问题2。如果HttpOnly的目的是防止JavaScript访问cookie,并且您仍然可以通过XmlHttpRequest对象通过JavaScript检索cookie,那么HttpOnly的意义何在?
编辑3:以下是维基百科的引文:
当浏览器收到这样的cookie时,应该在以下HTTP交换中照常使用它,而不是使其对客户端脚本可见。[32] 该
HttpOnly
标志不是任何标准的一部分,并且并非在所有浏览器中都实现。请注意,当前无法阻止通过XMLHTTPRequest读取或写入会话cookie。[33]。
我了解document.cookie
您使用HttpOnly时会被阻止。但是似乎您仍然可以在XMLHttpRequest对象中读取cookie值,从而允许使用XSS。HttpOnly如何使您比这更安全?通过使cookie本质上是只读的?
在您的示例中,我无法写信给您document.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()的结果保存到字符串中,对cookie进行正则表达式,然后将其发布到外部域。看来Wikipedia和ha.ckers在这一点上与我达成了一致,但我很乐意接受再教育...
最终编辑:啊,显然两个站点都错了,这实际上是FireFox中的错误。IE6和7实际上是当前唯一完全支持HttpOnly的浏览器。
重申我所学到的一切:
- HttpOnly限制了对IE7和FireFox中document.cookie的所有访问(不确定其他浏览器)
- HttpOnly从IE7的XMLHttpObject.getAllResponseHeaders()中的响应标头中删除cookie信息。
- XMLHttpObjects只能提交到其起源的域,因此不存在cookie的跨域发布。
编辑:此信息可能不再是最新的。