java cookie安全_关于Cookie安全性设置的那些事

一、标题:关于Cookie安全性设置的那些事

副标:httponly属性和secure属性解析

20130406104325699.jpg

二、引言

经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly。今天写出来倒腾下...

2.1首先必须的预备cookie知识。假如你第一次认识cookie,请先阅读这篇文章:

js于cookies.zip、google cookie.

三、Cookie属性

cookie内容,如图所示:

20130406104325277.jpg

HTTP response header:

Set-Cookie: =[; =][; expires=][; domain=]=[; path=][; secure][; HttpOnly]

1                      2                                   3                                4                                           5                           6            7

Cookie常用属性

一个Cookie包含以下信息:

1)Cookie名称,Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。

2)Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。

3)Expires,过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭后消失。

4)Path,一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。

5)Domain,子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。

6)Secure,安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用https协议连接时cookie才可以被页面访问。

7)HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。

20130406104325725.jpg

注意:上图为在w3shool上为setcookie语法,并没有显示7 httponly哦,各自版本支持问题。

四、认识httponly属性

4.1认识HTTPONLY

为了解决XSS(跨站脚本攻击)的问题,IE6开始支持cookie的HttpOnly属性,这个属性目前已被大多数浏览器(IE、FF、Chrome、Safari)所支持。当cookie中的HttpOnly属性被设置为true时(最后第7位),前端脚本就无法访问或操作cookie了(只能通过后台访问),这样XSS就失效了。HttpOnly会话cookie支持的浏览器,将仅用于发送HTTP(或HTTPS)请求时,从而限制从其他非HTTP的API(如JavaScript)访问。减轻此限制,但会议通过跨站点脚本(XSS)的cookie盗窃的威胁并没有消除。此功能仅适用于会话管理的cookie,而不是其他的浏览器的cookies。-----------------这里还没理解过来的,没关系,继续往下看

4.2 httponly效果演示

先看例子演示:

1.php

<?php setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);   ?>

20130406104326325.jpg

我们可以看到这个弹出来的这个框框是什么内容都没有的。

2.php

<?php setcookie("abc", "test" );   ?>

20130406104326961.jpg

我们通过对比可以看出,有HTTPONLY的页面,JS是不能获取到COOKIES内容的,而没有HTTPONLY的页面,JS轻松获取COOKIES无压力。

简易理解:阻止客户端脚本访问Cookie

新浪微博XSS的时候,就遇到过HTTPONLY,即使你通过XSS获取到了用户的COOKIES,也无法通过这个COOKIES访问用户的页面,所以说,HTTPONLY的设置是每个网站必备的!

4.3.HttpOnly的设置样例(未测试可行性)

javaE

private static final String CUSTOM_SESSION_ID = "YONGBOYID";

private static final String HTTP_ONLY = "HttpOnly";

private static final String SECURE = "secure";

private static final String SET_COOKIE = "Set-Cookie";

public void setHttpOnly(HttpServletResponse hResponse,HttpServletRequest hRequest){

if (hResponse.containsHeader(SET_COOKIE)) {

// 为会话Cookie添加HttpOnly

String sessionId = hRequest.getSession().getId();

String cookieValue = CUSTOM_SESSION_ID + "=" + sessionId + ";Path="

+ hRequest.getContextPath() + ";" + SECURE+ ";" + HTTP_ONLY;

hResponse.setHeader(SET_COOKIE, cookieValue);

}

}

具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取

C#

VB.NET

但是在.NET 1.1 ,中您需要手动添加

Servlet3

只需要在web.xml中添加如下片段:

在PHP中,cookie的HttpOnly有两种设置方式。

PHP4

PHP5

五、深挖

问:为什么设置了httponly-cookie盗窃的威胁并没有彻底消除?

答:因为httponly作用只是限制从其他非HTTP的API(如JavaScript)访问,cookie还是有可能传递的过程中被监听捕获后信息泄漏。

我查阅了msdn,它上面这么说的:

20130406104326687.jpg

将 HttpOnly属性设置为 true,并不能防止对网络频道具有访问权限的攻击者直接访问该 Cookie。工作站的安全也很重要,原因是恶意用户可能使用打开的浏览器窗口或包含持久性 Cookie 的计算机,以合法用户的标识获取对网站的访问。

setcookie("tmp", 100, NULL, NULL, NULL, TRUE, TRUE);【https】

6         7

总结下:

增多 cookie 安全性添加HttpOnly和secure属性

(1)HttpOnly属性

如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

(2)secure属性

当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被盗取到Cookie 的具体内容。

对于以上两个属性,

secure属性是防止信息在传递的过程中被监听捕获后信息泄漏。 6号位true

HttpOnly属性的目的是防止程序获取cookie后进行攻击。7号位true

注意,为了降低XSS跨站点脚本攻击带来的损害,通常需要将HTTP-only Cookie和其他技术组合使用。如果单独使用的话,它无法全面抵御跨站点脚本攻击。可以使用专门的工具(fiddler2,burp)对安全性进行测试。XSS_cookie跨站点脚本攻击示例请参阅我的其他文章。

六、资源链接

个人之拙见,不妥之处还望斧正。Luolired

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Java模拟登陆的示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.List; import java.util.Map; public class LoginDemo { public static void main(String[] args) throws Exception { String loginUrl = "http://example.com/login"; String username = "your_username"; String password = "your_password"; // Create a new URL object URL url = new URL(loginUrl); // Create a new HttpURLConnection object HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // Set the request method to POST connection.setRequestMethod("POST"); // Set the request headers connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // Set the request parameters String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8"); connection.setDoOutput(true); connection.getOutputStream().write(params.getBytes("UTF-8")); // Send the request int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // Read the response BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // Print the response System.out.println(response.toString()); // Get the cookies from the response headers Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookiesHeader = headerFields.get("Set-Cookie"); if (cookiesHeader != null) { // Parse the cookies and store them in a CookieManager object java.net.CookieManager cookieManager = new java.net.CookieManager(); for (String cookie : cookiesHeader) { cookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); } // Use the CookieManager to send subsequent requests with the cookies URL newUrl = new URL("http://example.com/protected_page"); HttpURLConnection newConnection = (HttpURLConnection) newUrl.openConnection(); cookieManager.getCookieStore().getCookies().forEach(c -> newConnection.addRequestProperty("Cookie", c.toString())); int newResponseCode = newConnection.getResponseCode(); if (newResponseCode == HttpURLConnection.HTTP_OK) { // Read the response BufferedReader newIn = new BufferedReader(new InputStreamReader(newConnection.getInputStream())); String newInputLine; StringBuffer newResponse = new StringBuffer(); while ((newInputLine = newIn.readLine()) != null) { newResponse.append(newInputLine); } newIn.close(); // Print the response System.out.println(newResponse.toString()); } else { System.out.println("Failed to fetch protected page"); } } } else { System.out.println("Failed to login"); } } } ``` 此代码将使用POST请求发送用户名和密码到登录页面。如果登录成功,它将获取响应标头中的cookie,并将其存储在CookieManager对象中。然后,它将使用CookieManager对象向受保护的页面发送新请求,并在请求中添加所有cookie。如果此请求成功,它将打印受保护页面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值