1. 程式人生 > >淺談HTTP Cookie 的 Secure 和 HTTPONLY屬性

淺談HTTP Cookie 的 Secure 和 HTTPONLY屬性

cape name col cap http 版本 span http協議 ring

  最近工作中遇到了關於cookie的secure及httponly屬性的問題,所以關註並學習了一段時間,這裏做一下簡要記錄。關於secure和httponly標誌的用途可以參考wikipedia.

  起因:系統PHP升級(5.1.7->5.4.5)並要求在下個升級後更新/etc/php.ini下的兩個變量,設定值為1.

  Session.cookie_secure=1

  Session.cookie_httponly=1

  由此引發了這次調查,調查的內容涉及到了php自身cookie函數、開源框架CodeIgniter、Javascript以及JQuery對這兩個屬性的支持情況。

  1、創建Cookie

  PHP:5.2之前只支持secure,5.2之後添加了對httponly的支持

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] );

CodeIgniter:在當前最新的2.1.2中只添加了對secure的支持,可是在github的CI開源項目上我發現了在下一個版本裏httponly將會被添加進去。

function
set_cookie($name = ‘‘, $value = ‘‘,$expire = ‘‘, $domain = ‘‘, $path = ‘/‘, $prefix = ‘‘, $secure = FALSE)

Javascript: 從這兩個屬性的作用就可以推測出,js對secure的支持是沒問題的,可是httponly本就是為限制js而產生的,當然httponly的cookie也不會被js創建

document.cookie = "username=" +escape("leon") + "; expires=15/02/2013 00:00:00; path=/;domain=www.example.com; secure";

Jquery: 作為js的框架,情況和js類似。

$.cookie(‘the_cookie‘, ‘the_value‘, { expires: 7,path: ‘/‘, domain: ‘x.com‘, secure: true });

綜上可知,httponly參數只可以在服務器端設置,即通過PHP的setcookie()方法設置。所以如需添加這個屬性,項目裏所有對cookie的set操作都應拿到服務端進行。

  httponly參數是用來限制非HTTP協議程序接口對客戶端COOKIE進行訪問的,所以客戶端腳本,如JS是無法取得這種COOKIE的,同時,JQuery中的“$.cookie(‘xxx‘)”方法也無法正常工作,所以想要在客戶端取到httponly的COOKIE的唯一方法就是使用AJAX,將取COOKIE的操作放到服務端,接收客戶端發送的ajax請求後將取值結果通過HTTP返回客戶端。

淺談HTTP Cookie 的 Secure 和 HTTPONLY屬性