一、标題:COOKIE之安全設定漫談
副标:httponly屬性和secure屬性解析
二、引言
經常有看到XSS跨站腳本攻擊竊取cookie案例,修複方案是有httponly。今天寫出來倒騰下...
2.1首先必須的預備cookie知識。假如你第一次認識cookie,請先閱讀我的這篇文章:
<<COOKIE漫談>>
三、Cookie屬性
cookie内容,如圖所示:
HTTP response header:
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參數
四、認識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:
setcookie("abc", "test" ); ?>
我們通過對比可以看出,有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屬性
五、深挖
問:為什麼設定了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跨站點腳本攻擊示例請參閱下列文章。
擴充:
1、
2、
3、
4、
5、、
6、