HttpOnly cookie如何处理AJAX请求?

HttpOnly cookie如何处理AJAX请求?

How do HttpOnly cookies work with AJAX requests?

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

编辑:如果指定了HttpOnly,Microsoft通过禁止JavaScript访问cookie来创建一种防止XSS攻击的方法。 FireFox后来采用了这个。所以我的问题是:如果你在一个网站上使用AJAX,比如StackOverflow,那么Http-Only cookies是一个选择吗?

编辑2:问题2.如果HttpOnly的目的是阻止JavaScript访问cookie,你仍然可以通过XmlHttpRequest对象通过JavaScript检索cookie,那么HttpOnly有什么意义呢?

编辑3:以下是维基百科的引用:

When the browser receives such a cookie, it is supposed to use it as usual in the following HTTP exchanges, but not to make it visible to client-side scripts.[32] The HttpOnly flag is not part of any standard, and is not implemented in all browsers. Note that there is currently no prevention of reading or writing the session cookie via a XMLHTTPRequest. [33].

我知道使用HttpOnly时会阻止document.cookie。但似乎您仍然可以在XMLHttpRequest对象中读取cookie值,从而允许使用XSS。 HttpOnly如何让你更安全?通过使cookie基本上只读?

在您的示例中,我无法写入您的document.cookie,但我仍然可以使用XMLHttpRequest对象窃取您的cookie并将其发布到我的域中。

1
2
3
4
5
6
7
8
<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());

编辑4:对不起,我的意思是你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,正则输出cookie,然后将其发布到外部域。似乎维基百科和哈克斯在这一方面同意我,但我希望能够重新接受教育......

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

重申我所学到的一切:

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

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


是的,HTTP-Only cookie可以用于此功能。它们仍将被提供给服务器的XmlHttpRequest请求。

在Stack Overflow的情况下,cookie将作为XmlHttpRequest请求的一部分自动提供。我不知道Stack Overflow身份验证提供程序的实现细节,但cookie数据可能会自动用于验证您的身份,而不是"投票"控制器方法。

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

但是,如果要为启用AJAX的功能提供安全性,则应用与传统站点相同的规则。您需要一些方法来识别每个请求背后的用户,并且cookie几乎总是达到目的的手段。

In your example, I cannot write to your document.cookie, but I can still steal your cookie and post it to my domain using the XMLHttpRequest object.

XmlHttpRequest不会发出跨域请求(正是因为您正在触及的各种原因)。

您通常可以使用iframe远程处理或JSONP注入脚本以将cookie发送到您的域,但是然后HTTP-Only再次保护cookie,因为它无法访问。

除非您在服务器端破坏了StackOverflow.com,否则您将无法窃取我的cookie。

Edit 2: Question 2. If the purpose of Http-Only is to prevent JavaScript access to cookies, and you can still retrieve the cookies via JavaScript through the XmlHttpRequest Object, what is the point of Http-Only?

考虑这种情况:

  • 我找到了将JavaScript代码注入页面的途径。
  • Jeff加载页面,我的恶意JavaScript修改了他的cookie以匹配我的。
  • 杰夫对你的问题提出了一个很好的答案。
  • 因为他用我的cookie数据而不是他的数据提交它,答案将成为我的。
  • 你投了"我的"出色的答案。
  • 我的真实账户得到了重点。

使用仅HTTP的cookie,第二步是不可能的,从而打败了我的XSS尝试。

Edit 4: Sorry, I meant that you could send the XMLHttpRequest to the StackOverflow domain, and then save the result of getAllResponseHeaders() to a string, regex out the cookie, and then post that to an external domain. It appears that Wikipedia and ha.ckers concur with me on this one, but I would love be re-educated...

那是对的。你仍然可以通过这种方式劫持会议。尽管可以成功执行甚至XSS攻击你的人,但它确实显着减少了人群。

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

它归结为这样一个事实:a)没有任何一项改进可以解决所有漏洞,而且b)任何系统都不会完全安全。 HTTP-Only是支持XSS的有用工具。

同样,即使X??mlHttpRequest上的跨域限制在防止所有XSS攻击方面没有100%成功,您仍然不会想到删除限制。


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


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

脚本不需要担心会话cookie的内容 - 只要您通过身份验证,那么用户或脚本发起的对服务器的任何请求都将包含相应的cookie。脚本本身无法知道cookie的内容这一事实无关紧要。

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

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


还有一点这个。

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

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

总的来说,我认为HTTPOnly应该谨慎使用。存在跨站点脚本攻击,攻击者使用简单的帖子表单安排用户提交源自其他站点的类似Ajax的请求,而不使用XMLHTTP,并且浏览器的仍然活动的cookie将对请求进行身份验证。

如果要确保对AJAX请求进行身份验证,请求本身和HTTP标头需要包含cookie。例如,通过使用脚本或独特的隐藏输入。 HTTPOnly会妨碍这一点。

通常,想要HTTPOnly的有趣理由是阻止网页中包含的第三方内容窃取cookie。但是有许多有趣的理由要非常谨慎地包含第三方内容,并积极过滤它。


作为澄清 - 从服务器的角度来看,AJAX请求所请求的页面与用户单击链接所做的标准HTTP get请求基本没有区别。所有正常的请求属性:user-agent,ip,session,cookies等都传递给服务器。


Therefore I am assuming JavaScript needs access to your cookies.

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

您的问题的正式答案如措辞 -"如果使用AJAX,JavaScript是否需要访问cookie?" - 因此"不"。例如,可以考虑使用Ajax请求的增强搜索字段来提供自动建议选项。在这种情况下,不需要cookie信息。


当您进行AJAX调用时,浏览器会自动处理Cookie,因此您的Javascript无需使用Cookie。


是的,cookie对Ajax非常有用。

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

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

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


不,AJAX呼叫请求的页面也可以访问cookie,而这是检查您是否已登录的内容。

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


推荐阅读