HttpOnly cookie如何与AJAX请求一起工作?

如果在基于cookie的访问限制的站点上使用AJAX, JavaScript需要访问cookie。HttpOnly cookie在AJAX站点上工作吗?

微软创建了一种防止XSS攻击的方法,如果指定了HttpOnly,则不允许JavaScript访问cookie。FireFox后来也采用了这种方法。所以我的问题是:如果你在一个网站上使用AJAX,比如StackOverflow, Http-Only cookie是一个选项吗?

问题2。如果HttpOnly的目的是防止JavaScript访问cookie,并且您仍然可以通过XmlHttpRequest对象,HttpOnly的意义是什么?

下面是来自维基百科的一段话:

当浏览器接收到这样的cookie时,它应该在接下来的HTTP交换中像往常一样使用它,但不使它对客户端脚本可见HttpOnly标志不是任何标准的一部分,也不是在所有浏览器中都实现。请注意,目前没有阻止通过XMLHTTPRequest读写会话cookie。[33]。

我理解当你使用HttpOnly时,document.cookie被阻塞。但是,您似乎仍然可以在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()的结果到一个字符串,regex出cookie,然后发布到一个外部域。看来维基百科和哈。在这一点上,很多人都同意我的观点,但我想接受再教育……

啊哈,显然两个站点都错了,这实际上是一个FireFox漏洞。IE6,7实际上是目前唯一完全支持HttpOnly的浏览器。

重申一下我所学到的一切:

  • HttpOnly限制对文档的所有访问。cookie在IE7 &和FireFox(不确定其他浏览器)
  • HttpOnly从IE7中的XMLHttpObject.getAllResponseHeaders()中的响应头中删除cookie信息。
  • XMLHttpObjects只能提交到它们产生的域,因此没有跨域发布cookie。

编辑:此信息可能不再是最新的。

81576 次浏览

不一定,这取决于你想做什么。你能详细说明一下吗?AJAX不需要访问cookie来工作,它可以自己发出请求来提取信息,AJAX调用的页面请求可以访问cookie数据&将其传递回调用脚本,而无需Javascript直接访问cookie

不,AJAX调用请求的页面也可以访问cookie &这将检查您是否登录。

你可以用Javascript做其他身份验证,但我不相信它,我总是喜欢把任何类型的身份验证检查在后端。

当您进行AJAX调用时,浏览器会自动处理cookie,因此Javascript不需要处理cookie。

因此,我假设JavaScript需要访问您的cookie。

来自浏览器的所有HTTP请求都会传输有关站点的cookie信息。JavaScript可以设置和读取cookie。从定义上看,Ajax应用程序并不需要cookie,但大多数web应用程序都需要cookie来维护用户状态。

对你的问题的正式回答——“如果使用AJAX, JavaScript是否需要访问cookie ?”-因此是“no”。例如,考虑使用Ajax请求提供自动建议选项的增强搜索字段。在这种情况下,不需要cookie信息。

澄清一下——从服务器的角度来看,AJAX请求所请求的页面本质上与用户单击链接所完成的标准HTTP get请求没有什么不同。所有正常的请求属性:user-agent、ip、session、cookie等都被传递给服务器。

是的,只有http的cookie就可以实现这个功能。它们仍然会被提供给服务器的XmlHttpRequest请求。

对于Stack Overflow, cookie是作为XmlHttpRequest请求的一部分自动提供的。我不知道Stack Overflow身份验证提供程序的实现细节,但cookie数据可能会自动用于验证您的身份,级别比“vote”控制器方法低。

更一般地,cookie是AJAX所需的。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-Only 是支持XSS的有用工具。

类似地,即使XmlHttpRequest的跨域限制不能100%成功地防止所有XSS攻击,您仍然不会想要删除该限制。

是的,对于基于Ajax的站点来说,它们是一个可行的选择。身份验证cookie不是用于脚本操作的,而是由浏览器包含在向服务器发出的所有HTTP请求中。

脚本不需要担心会话cookie说了什么——只要您通过了身份验证,那么任何由用户或脚本发起的对服务器的请求都将包含适当的cookie。脚本本身不能知道cookie的内容这一事实并不重要。

对于用于身份验证以外目的的任何cookie,如果您希望脚本能够修改或读取这些cookie,则可以在没有HTTP only标志的情况下设置这些cookie。您可以选择哪些cookie应该仅用于HTTP,因此,例如任何不敏感的内容,如UI首选项(排序顺序,左侧窗格折叠与否)都可以在cookie中与脚本共享。

我真的很喜欢HTTP专用cookie——它是那些专有的浏览器扩展之一,是一个非常巧妙的想法。

是的,cookie对Ajax非常有用。

将身份验证放在请求URL中是一种糟糕的做法。上周有一则关于从谷歌缓存中获取URL中的身份验证令牌的新闻。

不,没有办法阻止攻击。老式浏览器仍然允许通过javascript对cookie进行简单的访问。你可以绕过http,等等。只要付出足够的努力,你想出的任何东西都可以得到解决。诀窍在于,付出太多的努力就不值得了。

如果你想让你的网站更安全(没有完美的安全),你可以使用一个过期的身份验证cookie。然后,如果cookie被窃取,攻击者必须在过期前使用它。如果他们没有,那么你就有一个很好的迹象,那就是那个账户上有可疑活动。时间窗口越短,安全性越好,但生成和维护密钥对服务器的负载也越大。

还有一点。

Ajax并不严格要求cookie,但它们可能很有用,就像其他帖子提到的那样。将cookie标记为HTTPOnly以从脚本中隐藏它只是部分有效,因为不是所有浏览器都支持它,但也因为有常见的变通方法。

XMLHTTPresponse报头提供了cookie,这很奇怪,从技术上讲,服务器不必将cookie与响应一起返回。一旦在客户端上设置了它,它将一直保持设置直到过期。尽管有一些方案,cookie会随着每个请求而改变,以防止重复使用。因此,您可以通过更改服务器不为XMLHTTP响应提供cookie来避免这种解决方法。

一般来说,我认为HTTPOnly应该谨慎使用。在跨站点脚本攻击中,攻击者安排用户使用简单的post表单提交来自另一个站点的类似ajax的请求,而不使用XMLHTTP,浏览器仍然活跃的cookie将对请求进行身份验证。

如果您希望确保AJAX请求经过身份验证,则请求本身和HTTP报头需要包含cookie。例如,通过使用脚本或唯一的隐藏输入。HTTPOnly会阻碍它。

通常使用HTTPOnly的有趣原因是为了防止你的网页上包含的第三方内容窃取cookie。但也有许多有趣的原因让我们对包含第三方内容非常谨慎,并积极过滤。