上次我們提到了 Content-Security-Pilicy,這次我們來聊聊同樣是為了防禦 XSS 而生的另一個技術。
HttpOnly 簡介
Cookie 的概念雖然早在 1994 年就由 Netscape 的工程師 Montulli 提出,但當時仍未有完善的防護機制,像是 HttpOnly、Secure 等規範都是後來陸續被提出,直到 2011 年 4 月才在 RFC 6265中正式定案。而其中的 HttpOnly是專門為了抵禦攻擊者利用 Cross-Site Scripting (XSS) 手法來盜取用戶身份,此項 Cookie 防護設定應該是在 HTTP Headers 系列文中最廣為人知的項目。
HttpOnly 主要作用
說明 HttpOnly 主要作用之前,先談談 XSS 最常見的利用方式。XSS 攻擊早在 1990 年就被發現,此攻擊手法最常見的利用方式是存取使用者的 cookie 來獲得一些機敏資料。像是存取 session cookie 即可盜用使用者的身份(關於 session 的重要性,可以參考我們部落格的另一篇文章 HTTP Session 攻擊與防護),如果在 cookie 中記錄了其他機敏資訊,也可能會一併遭竊。因此若能阻止攻擊者存取帶有敏感資料的 cookie,就能減少 XSS 對使用者的影響,因而催生了 HttpOnly 機制。
當 cookie 有設定 HttpOnly flag 時,瀏覽器會限制 cookie 只能經由 HTTP(S) 協定來存取。因此當網站有 XSS 弱點時,若 cookie 含有 HttpOnly flag,則攻擊者無法直接經由 JavaScript 存取使用者的 session cookie,可降低使用者身份被盜用的機率。早期有些瀏覽器未完整實作 HttpOnly 所有功能,因此攻擊者仍可透過 XMLHttpRequest 讀取 cookie,但最近幾年各大瀏覽器也陸續阻擋了這個方式。因此 HttpOnly 可有效降低 XSS 的影響並提升攻擊難度。目前瀏覽器的支援列表如下:
其他瀏覽器支援列表以及各家程式語言使用 HttpOnly 的方式可參考 OWASP HttpOnly。
HttpOnly Demo
以下使用 PHP 程式碼為例:
<?phpsession_start();?><html><head><title>HttpOnly Demo</title></head><body><h3>HttpOnly Demo</h3><p>If you didn't set HttpOnly flag, cookie will write down by document.write().</p><script> document.write(document.cookie);</script></body></html>
在上圖中可看到 PHPSESSID 已成功被 JavaScript 存取,這也意味著網站有 XSS 弱點時,使用者的身份有較高的機率被盜用。為了使用 HttpOnly 進行防護,讓我們將 PHP 程式碼修改如下:
<?phpini_set("session.cookie_httponly",1);session_start();?>
我們可以使用畫面中右上角的 Chrome Edit This Cookie 套件看到 HttpOnly 已經被勾選(如紅框處),並且 PHPSESSID 已無法被 JavaScript 存取,不存在於 HTML 中。
目前 PHP 官方的教學是用 session_set_cookie_params 這個 function,可參考官方網頁的這篇說明
HttpOnly 實際使用案例
由於 HttpOnly 的使用方式較簡單,因此僅列舉幾個站台的使用結果圖片給大家參考,就不另外多做說明囉!
- T客邦 (www.techbang.com),有設定 HttpOnly
- 愛料理 (icook.tw),有設定 HttpOnly
- Mobile01 (www.mobile01.com),未設定 HttpOnly
- Giga Circle (tw.gigacircle.com),未設定 HttpOnly
結論
HttpOnly 是存在已久的技術,但在我們系列文第一篇的統計當中,採用的比例仍然偏低。如同之前我們提及的 Zone Transer問題,即使一項資安技術或資安議題存在很久,也需要大家持續關注。
但即使採用了 HttpOnly,也僅能防止惡意人士不正當存取 cookie,無法防禦其他的 XSS 攻擊方式,例如將使用者導向至釣魚網站騙取個資、導向至惡意網站植入後門、置換網頁外觀等等。同時未來仍有可能出現新的 XSS 攻擊手法,因此千萬別因設定了 HttpOnly 就掉以輕心,誤以為不會再被 XSS 手法侵害企業利益或用戶資料,仍然必須謹慎檢查每一個系統輸出輸入點,以避免未來因上述影響導致用戶或企業蒙受損失。