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

时间:2020-03-05 18:43:17  来源:igfitidea点击:

如果在基于cookie进行访问限制的网站上使用AJAX,则JavaScript需要访问cookie。 HttpOnly cookie可以在AJAX网站上使用吗?

编辑:Microsoft创建了一种方法,通过在指定HttpOnly的情况下禁止对cookie的JavaScript访问来防止XSS攻击。 FireFox后来采用了此方法。所以我的问题是:如果我们在像StackOverflow这样的网站上使用AJAX,是否可以选择仅使用Http的cookie?

编辑2:问题2. 如果HttpOnly的目的是防止JavaScript访问cookie,并且我们仍然可以通过XmlHttpRequest对象通过JavaScript检索cookie,那么HttpOnly的意义何在?

编辑3:以下是维基百科的引文:

When the browser receives such a cookie, it is supposed to use it as usual in the following HTTP exchanges, but not to make it visible to client-side scripts.[32] The HttpOnly flag is not part of any standard, and is not implemented in all browsers. Note that there is currently no prevention of reading or writing the session cookie via a XMLHTTPRequest. [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进行正则表达式,然后将其发布到外部域。看来Wikipedia和ha.ckers在这一方面与我达成了一致,但我很乐意接受再教育...

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

重申我所学到的一切:

  • HttpOnly限制了对IE7和FireFox中document.cookie的所有访问(不确定其他浏览器)
  • HttpOnly从IE7的XMLHttpObject.getAllResponseHeaders()中的响应标头中删除cookie信息。
  • XMLHttpObjects只能提交到其起源的域,因此没有cookie的跨域发布。

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

解决方案

回答

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

回答

不,AJAX呼叫请求的页面也可以访问Cookie,这就是检查我们是否已登录的原因。

我们可以使用Javascript进行其他身份验证,但是我不信任它,我总是更喜欢在后端放置任何形式的身份验证检查。

回答

当我们进行AJAX调用时,浏览器会自动处理Cookie,因此Javascript无需摆弄Cookie。

回答

Therefore I am assuming JavaScript needs access to your cookies.

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

短语"如果使用AJAX,JavaScript是否需要访问cookie?"的正式答案。因此为"否"。例如,考虑使用Ajax请求提供自动建议选项的增强搜索字段。在这种情况下,不需要Cookie信息。

回答

从服务器的角度来看,AJAX请求所请求的页面与用户单击链接完成的标准HTTP get请求本质上没有什么不同。所有正常的请求属性:用户代理,IP,会话,Cookie等均传递到服务器。

回答

是的,仅HTTP cookie可以使用此功能。它们仍将与XmlHttpRequest的请求一起提供给服务器。

对于Stack Overflow,cookie会作为XmlHttpRequest请求的一部分自动提供。我不知道Stack Overflow身份验证提供程序的实现细节,但是cookie数据可能会自动用于比"表决"控制器方法更低的级别来验证身份。

通常,AJAX不需要cookie。技术上只需要XmlHttpRequest支持(或者在较旧的浏览器上甚至是iframe远程处理)。

但是,如果要为启用AJAX的功能提供安全性,则适用与传统站点相同的规则。我们需要某种方法来识别每个请求背后的用户,而cookie几乎始终是达到此目的的手段。

In your example, I cannot write to your document.cookie, but I can still steal your cookie and post it to my domain using the XMLHttpRequest object.

XmlHttpRequest不会发出跨域请求(正是出于我们所涉及的种种原因)。

通常,我们可以注入脚本,以使用iframe远程处理或者JSONP将cookie发送到域,但是仅HTTP再次保护cookie,因为它不可访问。

除非我们在服务器端破坏了StackOverflow.com,否则我们将无法窃取我的cookie。

Edit 2: Question 2. If the purpose of Http-Only is to prevent JavaScript access to cookies, and you can still retrieve the cookies via JavaScript through the XmlHttpRequest Object, what is the point of Http-Only?

考虑这种情况:

  • 我找到了一种将JavaScript代码注入页面的途径。
  • Jeff加载了页面,而我的恶意JavaScript修改了他的cookie以匹配我的。
  • 杰夫对问题提出了出色的回答。
  • 因为他是使用我的Cookie数据而不是他的cookie数据提交的,所以答案将是我的。
  • 我们投票赞成"我的"杰出回答。
  • 我的真实帐户很重要。

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

Edit 4: Sorry, I meant that you could send the XMLHttpRequest to the StackOverflow domain, and then save the result of getAllResponseHeaders() to a string, regex out the cookie, and then post that to an external domain. It appears that Wikipedia and ha.ckers concur with me on this one, but I would love be re-educated...

没错我们仍然可以通过这种方式进行会话劫持。尽管确实可以成功执行XSS骇客攻击,但确实可以使一群人成功瘦身。

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

可以归结为以下事实:a)没有任何一项改进可以解决所有漏洞,并且b)没有任何系统可以完全安全。仅HTTP是支持XSS的有用工具。

同样,即使X​​mlHttpRequest上的跨域限制在阻止所有XSS漏洞方面并非100%成功,但我们仍然永远不会梦想消除该限制。

回答

是的,对于基于Ajax的站点,它们是可行的选择。身份验证cookie不能通过脚本进行操作,而是仅在浏览器向服务器发出的所有HTTP请求中包含在其中。

只要我们通过身份验证,脚本就不必担心会话cookie的内容,因此,由用户或者脚本发起的对服务器的任何请求都将包含适当的cookie。脚本本身不能知道Cookie的内容这一事实无关紧要。

对于用于身份验证以外的任何cookie,如果我们希望脚本能够修改或者读取它们,则可以不使用HTTP only标志来设置它们。我们可以选择哪些cookie仅应为HTTP,例如,可以使用脚本在cookie中共享任何不敏感的东西,例如UI首选项(排序顺序,是否折叠左窗格)。

我真的很喜欢仅HTTP cookie,它是那些专有的浏览器扩展之一,这是一个非常巧妙的主意。

回答

是的,cookie对Ajax非常有用。

将身份验证放在请求URL中是不好的做法。上周有个新闻报道,关于从Google缓存中获取URL中的身份验证令牌。

不,没有办法防止攻击。较旧的浏览器仍然允许通过javascript轻松访问cookie。我们只能绕过http等。只要有足够的努力,我们想出的任何东西都可以解决。诀窍是要付出太多的努力才值得。

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

回答

还有更多的东西。

Ajax并不严格要求cookie,但正如其他海报所提到的那样,它们可能会有用。将Cookie标记为HTTPOnly只能部分隐藏脚本,因为并非所有浏览器都支持它,而且还存在一些常见的解决方法。

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

但总的来说,我认为应谨慎使用HTTPOnly。在跨站点脚本攻击中,攻击者利用简单的帖子形式,使用户安排用户提交从另一个站点发出的类似ajax的请求,而不使用XMLHTTP,并且浏览器的活动cookie会对请求进行身份验证。

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

通常,希望使用HTTPOnly的有趣原因是防止网页上包含的第三方内容窃取cookie。但是,有很多有趣的原因对于包含第三方内容并进行积极过滤非常谨慎。