HttpOnly cookies如何处理AJAX请求?

如果在基于cookie访问限制的网站上使用AJAX,则JavaScript需要访问Cookie。 HttpOnly Cookie是否可以在AJAX网站上运行?

编辑:微软创build了一种方法来防止XSS攻击,如果指定HttpOnly,则不允许JavaScript访问cookie。 火狐后来通过这个。 所以我的问题是:如果您在站点上使用AJAX,如StackOverflow,Http专用cookie是一个选项?

编辑2:问题2.如果HttpOnly的目的是为了防止JavaScript访问cookie,并且您仍然可以通过JavaScript通过XmlHttpRequest对象检索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()的结果保存到一个string中,然后将这个cookie正则expression出来,然后发送到一个外部域。 看来,维基百科和hackckers在这一点上同意我的意见,但是我很想再次受到教育。

最后编辑:啊,显然这两个网站都是错误的,这实际上是一个在FireFox中的错误 。 IE6&7实际上是目前完全支持HttpOnly的唯一浏览器。

重申我所学到的一切:

  • HttpOnly限制所有访问document.cookie在IE7&和FireFox(不知道其他浏览器)
  • HttpOnly从IE7中的XMLHttpObject.getAllResponseHeaders()中的响应头中删除cookie信息。
  • XMLHttpObjects可能只能被提交到它们来源的域名,所以没有跨域发布的cookies。

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

是的,只有HTTP的cookie可以用于这个function。 它们仍然会被提供给服务器的XmlHttpRequest请求。

在堆栈溢出的情况下,cookie将作为XmlHttpRequest请求的一部分自动提供。 我不知道堆栈溢出身份validation提供程序的实现细节,但该cookie数据可能会自动用于在比“投票”控制器方法更低的级别validation您的身份。

更一般地说,AJAX不需要cookie。 支持XmlHttpRequest(甚至在旧版本的浏览器上进行iframe远程处理)是技术上需要的。

但是,如果您想为启用AJAX的function提供安全性,则适用与传统网站相同的规则。 您需要一些方法来识别每个请求后面的用户,并且Cookie几乎总是达到此目的的手段。

在你的例子中,我不能写入你的document.cookie,但我仍然可以窃取你的cookie,并使用XMLHttpRequest对象将其发布到我的域。

XmlHttpRequest不会发出跨域请求(正是你碰到的原因)。

通常情况下,您可以使用iframe远程处理或JSONP将脚本注入脚本以将cookie发送到您的域,但是由于HTTP无法访问,因此仅保护cookie。

除非你在服务器端妥协了StackOverflow.com,否则你将无法窃取我的cookie。

编辑2:问题2.如果Http-Only的目的是为了防止JavaScript访问cookie,并且仍然可以通过JavaScript通过XmlHttpRequest对象检索cookie,那么Http-Only的意义何在?

考虑这种情况:

  • 我find了一个将JavaScript代码注入页面的途径。
  • 杰夫加载页面,我的恶意JavaScript修改他的cookie来匹配我的。
  • 杰夫对你的问题提出了一个很好的答案。
  • 因为他用我的cookie数据而不是他提交的,答案将成为我的。
  • 你投了“我的”恒星的答案。
  • 我真正的帐户得到了重点。

只使用HTTP的cookie,第二步将是不可能的,从而击败我的XSS尝试。

编辑4:对不起,我的意思是你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到一个string中,然后将这个cookie正则expression出来,然后发送到一个外部域。 看来,维基百科和hackckers在这一点上同意我的意见,但是我很想再次受到教育。

这是正确的。 你仍然可以通过这种方式劫持会话。 尽pipe如此,它也大大减less了那些能够成功执行XSS攻击的人群。

但是,如果回到我的示例场景中,可以看到HTTP-Only成功切断了依赖于修改客户端Cookie的XSS攻击(并不罕见)。

这归结为以下事实:a)单一的改进将不能解决所有的漏洞,以及b)没有系统将会完全安全。 HTTP-Only 支持XSS的有用工具。

同样,即使X​​mlHttpRequest的跨域限制在防止所有的XSS攻击方面并不是100%的成功,你仍然不会想去除限制。

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

是的,他们是一个基于Ajax的网站的可行select。 身份validationcookie不适用于脚本操作,但仅由浏览器包含在向服务器发出的所有HTTP请求中。

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

对于用于validation以外目的的任何cookie,如果您希望脚本能够修改或读取这些cookie,则可以将这些cookie设置为不使用HTTP only标志。 你可以select哪个cookie只能是HTTP,所以例如任何非UI敏感的东西(sorting顺序,折叠左窗格或不),都可以通过脚本与cookies共享。

我真的很喜欢只有HTTP的cookie – 这是那些专有的浏览器扩展之一,是一个非常整洁的想法。

这还有一点。

Ajax并不严格要求cookies,但是像其他海报所提到的那样,Ajax可以是有用的。 标记一个cookie HTTPOnly从脚本中隐藏它只是部分的工作,因为并不是所有的浏览器都支持它,但是也有一些常见的解决方法。

XMLHTTPresponse头文件提供cookie是很奇怪的,在技术上,服务器不必返回带有响应的cookie。 一旦它在客户端上设置,它将保持设置,直到它到期。 虽然有一些scheme可以在每次请求时改变cookie,以防止重复使用。 因此,您可以通过将服务器更改为不提供XMLHTTP响应中的cookie来避免该解决方法。

一般来说,我认为HTTPOnly应该谨慎使用。 存在跨站点脚本攻击,攻击者安排用户使用简单的发布表单提交源自其他站点的类似Ajax的请求,而不使用XMLHTTP,并且浏览器的仍然活动的Cookie将validation请求。

如果你想确保一个AJAX请求被authentication,请求本身和HTTP头需要包含cookie。 例如通过使用脚本或独特的隐藏input。 HTTPOnly会阻止这一点。

通常,希望HTTPOnly的有趣的理由是阻止您的网页上包含的第三方内容窃取cookie。 但有很多有趣的理由要对第三方内容加以谨慎,并积极地进行过滤。

当您进行AJAX调用时,Cookie会自动由浏览器处理,因此不需要使用JavaScript来搞乱Cookie。

因此,我认为JavaScript需要访问您的Cookie。

来自浏览器的所有HTTP请求都会传输您的相关网站的Cookie信息。 JavaScript可以设置和读取cookie。 Cookie不是Ajax应用程序定义所必需的,但它们是大多数Web应用程序维护用户状态所必需的。

正如你所说的问题的答案 – “如果使用AJAX,JavaScript是否需要访问cookie? – 因此是“不”。 例如,想一想使用Ajax请求提供自动build议选项的增强search字段。 在这种情况下,不需要cookie信息。

澄清 – 从服务器的angular度来看,AJAX请求所请求的页面与用户单击链接所执行的标准HTTP请求基本上没有什么不同。 所有正常的请求属性:用户代理,IP,会话,cookies等传递给服务器。

不,AJAX调用请求的页面也可以访问cookie,这就是检查你是否login的。

你可以用Javascript做其他authentication,但我不会相信它,我总是喜欢在后端进行任何types的authentication检查。

是的,Cookie对Ajax非常有用。

将authentication放在请求URL中是不好的做法。 上周有一个关于从谷歌caching中获取URL中的authentication令牌的新闻。

不,没有办法阻止攻击。 旧的浏览器仍然允许通过JavaScript轻松访问cookie。 你只能绕过http等。无论你提出什么,都可以得到足够的努力。 诀窍是要付出太多的努力才是有价值的。

如果你想使你的网站更安全(没有完美的安全性),你可以使用一个过期的身份validationcookie。 那么,如果cookie被盗,攻击者必须在它到期之前使用它。 如果他们没有,那么你有一个很好的迹象表明有这个帐户的可疑活动。 时间窗口越短,安全性越好,但服务器生成和维护密钥的负载越大。