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跨站點腳本攻擊示例請參閱個人其餘文章。