天天看點

COOKIE之安全設定漫談

一、标題:COOKIE之安全設定漫談

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

二、引言

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

2.1首先必須的預備cookie知識。假如你第一次認識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資訊。

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>

COOKIE之安全設定漫談

我們可以看到這個彈出來的這個框框是什麼内容都沒有的!

2.php:

setcookie("abc", "test" );   ?>

COOKIE之安全設定漫談

我們通過對比可以看出,有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,它上面這麼說的:

COOKIE之安全設定漫談

将 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、