【发布时间】:2010-09-06 21:04:25
【问题描述】:
如果在基于 cookie 的访问限制的站点上使用 AJAX,则 JavaScript 需要访问 cookie。 HttpOnly cookie 可以在 AJAX 网站上工作吗?
编辑: 如果指定了 HttpOnly,Microsoft 通过禁止 JavaScript 访问 cookie 创建了一种防止 XSS 攻击的方法。 FireFox 后来采用了这个。所以我的问题是:如果您在 StackOverflow 之类的网站上使用 AJAX,是否可以选择 Http-Only 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,然后发布到外部域。维基百科和黑客似乎在这一点上同意我的观点,但我很想接受再教育......
最终编辑: 啊,显然两个网站都错了,这实际上是bug in FireFox。 IE6 & 7 实际上是目前唯一完全支持 HttpOnly 的浏览器。
重申我所学到的一切:
- HttpOnly 限制对 IE7 & 和 FireFox 中的 document.cookie 的所有访问(不确定其他浏览器)
- HttpOnly 从 IE7 中 XMLHttpObject.getAllResponseHeaders() 的响应头中删除 cookie 信息。
- XMLHttpObjects 只能提交到它们起源的域,因此不会跨域发布 cookie。
编辑:此信息可能不再是最新的。
【问题讨论】:
-
我将您的示例放入了一个greasemonkey 脚本中,看起来FF 不再显示cookie。出色的研究和示例。
-
也许使用同源策略,您无法向与脚本运行所在的域不同的域发出 http 请求;但是,我相信您可以通过使用 window.location 将用户重定向到页面并通过查询字符串参数传递所有信息来轻松传递 cookie。
-
@LucaMarzi "你不能向与运行脚本的域不同的域发出 http 请求" 你是说站点 X 不能包含图像来自主机 Y? (自 Mosaic 以来所有浏览器都支持的功能?)