zoukankan      html  css  js  c++  java
  • 关于Cookie安全性设置的那些事

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

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

    二、引言

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

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

    js于cookies.zip、google cookie.

    三、Cookie属性

    cookie内容,如图所示:

     

    HTTP response header:

    Set-Cookie: <name>=<value>[; <Max-Age>=<age>][; expires=<date>][; domain=<domain_name>]=[; path=<some_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信息。

    注意:上图为在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);   ?> <script>alert(document.cookie);</script>

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

    2.php

    <?php setcookie("abc", "test" );   ?> <script>alert(document.cookie);</script>

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

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

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

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

    javaE

    1
    2
    response.setHeader("Set-Cookie", "cookiename=value;
    Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

        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的,但使用如下方式可以读取

    1
    Cookie cookies[]=request.getCookies();

    C#

    1
    2
    3
    HttpCookie myCookie = new HttpCookie("myCookie");  
    myCookie.HttpOnly = true
    Response.AppendCookie(myCookie);

    VB.NET

    1
    2
    3
    Dim myCookie As HttpCookie = new HttpCookie("myCookie"
    myCookie.HttpOnly = True 
    Response.AppendCookie(myCookie)

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

    1
    Response.Cookies[cookie].Path += ";HTTPOnly";

    Servlet3

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

    1
    2
    3
    4
    5
    6
    <session-config>
      <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
      </cookie-config>
    </session-config>

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

    1
    2
    3
    4
    方法一:
    header("Set-Cookie:tmp=100;HttpOnly");
    方法二:
    setcookie("tmp"100, NULL, NULL, NULL, NULL, TRUE);

    PHP4

    1
    header("Set-Cookie: hidden=value; httpOnly");

    PHP5

    1
    setcookie("abc""test", NULL, NULL, NULL, NULL, TRUE);    最后一个参数为HttpOnly属性

    五、深挖

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

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

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

    将 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跨站点脚本攻击示例请参阅我的其他文章。

    六、资源链接

    1、AVA年份安全 第四周 SESSION COOKIE HTTPONLY 标识

    2、http://msdn.microsoft.com/zh-cn/library/system.web.httpcookie.httponly.aspx

    3、https://www.owasp.org/index.php/HTTPOnly

    4、http://www.w3school.com.cn/php/func_http_setcookie.asp

    5、Cookie使用安全HttpOnly引见以及防止XSS攻击时的作用

    6、http://www.myexception.cn/mobile/824869.html 

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

    转自http://www.2cto.com/Article/201304/200529.html

  • 相关阅读:
    【分治】动态点分治 ([ZJOI2007]捉迷藏)
    【图论】Tarjan 割点(割顶)
    selenium (五) ActionChains
    selenium (四) WebDriverWait 与 expected_conditions
    selenium (三) 下拉框选项操作
    selenium (二) 浏览器的基本操作
    selenium (一) webdriver 元素定位方法
    selenium 常见问题
    locust 实战:完成用户登录并下单的流程
    MyEclipse 工具过期后,重新激活方法
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4143429.html
Copyright © 2011-2022 走看看