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的唯一浏览器。
重申我所学到的一切:
编辑:这些信息可能不再是最新的。
是的,只有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的作用是什么?
考虑这种情况:
使用仅限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