1、標題:COOKIE之安全設置漫談php
副標:httponly屬性和secure屬性解析html
2、引言前端
常常有看到XSS跨站腳本攻擊竊取cookie案例,修復方案是有httponly。今天寫出來倒騰下...java
2.1首先必須的預備cookie知識。假如你第一次認識cookie,請先閱讀個人這篇文章:web
<<COOKIE漫談>>瀏覽器
3、Cookie屬性安全
cookie內容,如圖所示:服務器
HTTP response header:cookie
Set-Cookie: <name>=<value>[; <Max-Age>=<age>][; expires=<date>][; domain=<domain_name>]=[; path=<some_path>][; secure][; HttpOnly]網絡
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
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
具體參數的含義再次不作闡述,設置完畢後經過js腳本是讀不到該cookie的,但使用以下方式能夠讀取
Cookie cookies[]=request.getCookies();
C#
HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);
VB.NET
Dim myCookie As HttpCookie = new HttpCookie("myCookie")
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)
可是在.NET 1.1 ,中您須要手動添加
Response.Cookies[cookie].Path += ";HTTPOnly";
Servlet3
只須要在web.xml中添加以下片斷:
<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
在PHP中,cookie的HttpOnly有兩種設置方式
方法一:
header("Set-Cookie:tmp=100;HttpOnly");
方法二:
setcookie("tmp", 100, NULL, NULL, NULL, NULL, TRUE);
PHP4
header("Set-Cookie: hidden=value; httpOnly");
PHP5
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】
總結:
增多 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跨站點腳本攻擊示例請參閱下列文章。
擴展:
一、AVA年份安全 第四周 SESSION COOKIE HTTPONLY 標識
二、http://msdn.microsoft.com/zh-cn/library/system.web.httpcookie.httponly.aspx
三、https://www.owasp.org/index.php/HTTPOnly
四、http://www.w3school.com.cn/php/func_http_setcookie.asp