
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:以下是维基百科的引用:
我知道使用HttpOnly时会阻止
在您的示例中,我无法写入您的
编辑4:对不起,我的意思是你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,正则输出cookie,然后将其发布到外部域。似乎维基百科和哈克斯在这一方面同意我,但我希望能够重新接受教育...... 最终编辑:啊,显然这两个网站都是错误的,这实际上是FireFox中的一个错误。 IE6和7实际上是目前唯一完全支持HttpOnly的浏览器。 重申我所学到的一切:
编辑:此信息可能不再是最新的。 是的,HTTP-Only cookie可以用于此功能。它们仍将被提供给服务器的XmlHttpRequest请求。 在Stack Overflow的情况下,cookie将作为XmlHttpRequest请求的一部分自动提供。我不知道Stack Overflow身份验证提供程序的实现细节,但cookie数据可能会自动用于验证您的身份,而不是"投票"控制器方法。 更一般地说,AJAX不需要cookie。 XmlHttpRequest支持(甚至是旧版浏览器上的iframe远程处理)是技术上所需要的。 但是,如果要为启用AJAX的功能提供安全性,则应用与传统站点相同的规则。您需要一些方法来识别每个请求背后的用户,并且cookie几乎总是达到目的的手段。
XmlHttpRequest不会发出跨域请求(正是因为您正在触及的各种原因)。 您通常可以使用iframe远程处理或JSONP注入脚本以将cookie发送到您的域,但是然后HTTP-Only再次保护cookie,因为它无法访问。 除非您在服务器端破坏了StackOverflow.com,否则您将无法窃取我的cookie。
考虑这种情况:
使用仅HTTP的cookie,第二步是不可能的,从而打败了我的XSS尝试。
那是对的。你仍然可以通过这种方式劫持会议。尽管可以成功执行甚至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等都传递给服务器。
|