HttpOnly cookie如何处理AJAX请求?

时间:2008-08-26 13:06:15

标签: ajax cookies httponly

如果在具有基于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:以下是维基百科的引用:

  

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

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

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

<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,然后发布到外部域名。维基百科和ha.ckers似乎同意我的观点,但我希望能够重新接受教育......

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

重申我所学到的一切:

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

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

9 个答案:

答案 0 :(得分:61)

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

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

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

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

  

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

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

您通常可以使用iframe远程处理或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的cookie,第二步是不可能的,从而破坏了我的XSS尝试。

  

编辑4:抱歉,我的意思是你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,正则输出cookie,然后将其发布到外部域。维基百科和ha.ckers似乎同意我的观点,但我希望能够重新接受教育......

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

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

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

我真的很喜欢HTTP唯一的cookie - 这是一个非常简洁的专有浏览器扩展。

答案 3 :(得分:2)

还有更多内容。

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

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

  
    

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

  

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

不,AJAX呼叫请求的页面也可以访问cookie&amp;这就是检查你是否登录的原因。

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

答案 8 :(得分:0)

是的,Cookie对Ajax非常有用。

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

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

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