HttpOnly Cookie如何与AJAX请求一起使用?

如果在具有基于Cookie访问限制的网站上使用AJAX,JavaScript需要访问Cookie。 HttpOnly cookie会在AJAX网站上运行吗?

编辑:如果指定了HttpOnly,Microsoft创建了一种防止XSS攻击的方法,即禁止JavaScript访问cookie。 FireFox后来采纳了这一点。 所以我的问题是:如果您在站点上使用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()的结果保存到一个字符串中,然后将这些cookie正则表达出来,然后将其发布到外部域。 看起来维基百科和ha.ckers在这一点上同意我的观点,但我很想重新接受教育......

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

重申我所学到的一切:

  • HttpOnly限制在IE7和FireFox中对document.cookie的所有访问(不确定其他浏览器)
  • HttpOnly从IE7中的XMLHttpObject.getAllResponseHeaders()中的响应头中删除cookie信息。
  • XMLHttpObjects只能提交给它们的域名,所以没有跨域发布cookies。
  • 编辑:这些信息可能不再是最新的。


    是的,只有HTTP的cookie对此功能会很好。 他们仍然会提供XmlHttpRequest的请求到服务器。

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

    更一般地, 不需要对AJAX的cookies。 支持XmlHttpRequest(或者甚至是在旧版浏览器上的内置框架远程处理)是技术上需要的。

    但是,如果您想为启用AJAX的功能提供安全性,则适用与传统网站相同的规则。 您需要一些方法来识别每个请求后面的用户,并且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的作用是什么?

    考虑这种情况:

  • 我找到了一个将JavaScript代码注入页面的途径。
  • 杰夫加载页面,我的恶意JavaScript修改他的cookie以匹配我的页面。
  • 杰夫对你的问题提出了一个很好的答案。
  • 因为他用我的cookie数据而不是他提交的,答案将成为我的。
  • 你投了“我的”恒星答案。
  • 我的真实账户得到了重点。
  • 使用仅限HTTP的cookie,第二步将不可能,从而击败我的XSS尝试。

    编辑4:对不起,我的意思是说你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到一个字符串中,然后将这些cookie正则表达出来,然后将其发布到外部域。 看起来维基百科和ha.ckers在这一点上同意我的观点,但我很想重新接受教育......

    这是正确的。 你仍然可以以这种方式劫持会话。 尽管如此,它确实可以显着减少一些能够成功执行XSS攻击的人群。

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

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

    同样,尽管XmlHttpRequest的跨域限制在防止所有XSS漏洞攻击方面并不是100%成功,但您仍然不会想要移除限制。


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


    是的,它们是基于Ajax的网站的可行选择。 身份验证Cookie不适用于脚本操作,但仅由浏览器在向服务器发出的所有HTTP请求中包含。

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

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

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

    链接地址: http://www.djcxy.com/p/22283.html

    上一篇: How do HttpOnly cookies work with AJAX requests?

    下一篇: Authorization and authentication with Microservices