首页 文章

HttpOnly cookie如何处理AJAX请求?

提问于
浏览
182

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

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

编辑2:问题2.如果HttpOnly的目的是阻止JavaScript访问cookie,你仍然可以通过JavaScript通过XmlHttpRequest对象检索cookie, what is the point of 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和7实际上是目前唯一完全支持HttpOnly的浏览器 .

重申我所学到的一切:

  • HttpOnly限制对IE7和FireFox中的document.cookie的所有访问(不确定其他浏览器)

  • HttpOnly从IE7中的XMLHttpObject.getAllResponseHeaders()中的响应头中删除cookie信息 .

  • XMLHttpObjects只能提交给它们来自的域,因此没有cookie的跨域发布 .

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

9 回答

  • 0

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

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

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

  • 2

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

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

    更一般地说,AJAX需要cookie . [887240_] . 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数据而不是他的数据提交它,答案将成为我的答案 .

    • 你投了"my"恒星答案 .

    • 我的真实账户得到了重点 .

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

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

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

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

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

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

  • 1

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

  • 59

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

  • 1

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

  • 1

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

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

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

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

  • 4

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

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

  • 3

    还有一点这个 .

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

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

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

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

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

  • 0

    是的,cookie对Ajax非常有用 .

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

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

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

相关问题