關於Cookie安全性設置的那些事

1、標題:關於Cookie安全性設置的那些事php

      副標:httponly屬性和secure屬性解析前端

 

2、引言java

常常有看到XSS跨站腳本攻擊竊取cookie案例,修復方案是有httponly。今天寫出來倒騰下...web

2.1首先必須的預備cookie知識。假如你第一次認識cookie,請先閱讀這篇文章:瀏覽器

js於cookies.zip、google cookie.安全

 

3、Cookie屬性服務器

cookie內容,如圖所示:cookie

HTTP response header:網絡

Set-Cookie: <name>=<value>[; <Max-Age>=<age>][; expires=<date>][; domain=<domain_name>]=[; path=<some_path>][; secure][; HttpOnly]session

                                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哦,各自版本支持問題。

 

4、認識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");

具體參數的含義再次不作闡述,設置完畢後經過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屬性

 

5、深挖

問:爲何設置了httponly-cookie盜竊的威脅並無完全消除?

答:由於httponly做用只是限制從其餘非HTTP的API(如JavaScript)訪問,cookie仍是有可能傳遞的過程當中被監聽捕獲後信息泄漏。

我查閱了msdn,它上面這麼說的:

 

將 HttpOnly 屬性設置爲 true,並不能防止對網絡頻道具備訪問權限的攻擊者直接訪問該 Cookie。針對這種狀況,應考慮使用安全套接字層 (SSL) 來提供幫助。工做站的安全也很重要,緣由是惡意用戶可能使用打開的瀏覽器窗口或包含持久性 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跨站點腳本攻擊示例請參閱個人其餘文章。

相關文章
相關標籤/搜索