簡介
在用戶會話中Cookies是一個十分重要的東西,一個身份驗證的Cookies就相當於是密碼。保衛這些身份驗證的Cookies是一個十分重要的話題。在本文中,我們將演示如何在PHP應用中執行某些Cookies屬性從而在某些***中保護我們的Cookies。
使用HTTP Header保護Cookies
這是一個已知的事實,跨站腳本***是一個十分危險的漏洞,其能夠讓***者從用戶瀏覽器竊取到Cookies。HttpOnly的引進能夠禁用外部JavaScript腳本讀取Cookies。即使應用程序本身存在XSS漏洞,只要開啓了HTTPOnly標記就無法讀取Cookies。
現在我們就打開上一篇文章中使用過的簡單應用程序。
首先,觀察HTTP響應中的頭信息
HTTP/1.1 200 OKDate: Sun, 12 Apr 2015 15:07:14 GMTServer: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0X-Powered-By: PHP/5.6.2Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheSet-Cookie: PHPSESSID=a2ed2bf468dd811c09bf62521b07a023; path=/Content-Length: 820Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=UTF-8
正如我們所見,在Set-Cookie頭中沒有額外的標記。如果該應用存在Xss漏洞那麼***者就能夠輕鬆獲取到Cookies信息。
爲了避免這種情況,我們可以使用HTTPOnly標記。這使得我們只能夠通過HTTP協議來發送Cookies信息,而不能使用JavaScript。
啓用HTTPOnly標記
如下示例代碼片段中演示了在PHP應用中啓用HTTPOnly標記的一種方法:
Admin Home
Welcome to Dashboard...
You are logged in as:
[logout]
Search Values
You Entered:
從上面的代碼片段中我們可以看出下面這一行代碼是用來開啓HTTPOnly的:
ini_set("session.cookie_httponly", "True");
接下來我們就來看看在HTTPOnly標記開啓之後獲得的HTTP頭信息
HTTP/1.1 200 OKDate: Sun, 12 Apr 2015 15:03:15 GMTServer: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0X-Powered-By: PHP/5.6.2Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheSet-Cookie: PHPSESSID=36cb82e1d98853f8e250d89be857a0d3; path=/; HttpOnlyContent-Length: 820Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=UTF-8
在上面的信息中我們可以從Set-Cookie頭信息中看出已經成功開啓HTTPOnly
Set-Cookie: PHPSESSID=36cb82e1d98853f8e250d89be857a0d3; path=/; HttpOnly
HttpOnly標記的效果如下,當***者挖掘到一個Xss漏洞之後,嘗試着使用JavaScript腳本讀取Cookies時,是不會被執行的。
從上圖中我們可以看出,不能通過執行腳本來讀取Cookies,即使存在Xss漏洞!
Secure標記
另一個Cookies屬性就是“Secure”,我們經常能夠見到一個網站同時存在着HTTP協議和HTTPS協議。當應用通過HTTP傳送其Cookies的時候,由於使用的是明文傳輸方式,所以***者可以有多種方法劫持信息。“Secure”屬性也是設置在Set-Cookie頭中,它可以保證所有的Cookies信息只通過HTTPS協議進行傳輸。
如下示例代碼片段中演示了在PHP應用中啓用Secure標記的一種方法:
Admin Home
Welcome to Dashboard...
You are logged in as:
[logout]
Search Values
You Entered:
從上面的代碼片段中我們可以看出下面這一行代碼是用來開啓Secure的:
ini_set("session.cookie_secure", "True");
接下來我們就看看上面代碼執行後獲取到的HTTP Headers
HTTP/1.1 200 OKDate: Sun, 12 Apr 2015 15:14:30 GMTServer: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0X-Powered-By: PHP/5.6.2Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheSet-Cookie: PHPSESSID=f95afc96ecb7acc6c288d31f941e682f; path=/; secureContent-Length: 820Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=UTF-8
從上面的頭信息中我們看到,Secure屬性已經成功啓用。我的本地主機沒有開啓HTTPS支持,當我刷新頁面時,由於沒有HTTPS協議支持Cookies沒有通過Secure通道,且會話不會通過HTTP協議。這是由於會話沒有發送到服務器,因爲必須要HTTPS協議纔可用。
關閉瀏覽器結束會話
關閉瀏覽器前沒有單擊註銷按鈕對於用戶來說這十分常見。當我們在使用一個敏感的應用時,在關閉瀏覽器時強制註銷Cookies很有必要。
下面兩行代碼可以在PHP中實現該過程
session_set_cookie_params(0);session_start();
假設我們運行的頁面集合了上面的屬性。登錄應用然後關閉瀏覽器,如果我們重新打開這個頁面,會話不會活躍。
爲了檢測這個屬性是否已經成功啓用,我們可以在chrome瀏覽器中使用類似“EditThisCookie”的cookie編輯器。
登錄頁面並啓用EditThisCookie擴展
如上圖,將Session選項勾選上,這會保證我們的會話在關閉瀏覽器後不會繼續活躍。
同樣我們也可以在Chrome的開發者工具中設置
以下爲Cookies的其他一些屬性
Domain: 該屬性控制着哪些Cookies能夠訪問域
Path: 指定Cookies能夠訪問域的路徑
Expiration: 該屬性指定Cookies過期後不再能使用
只需要3行代碼即可將這三個屬性加入到PHP應用中:
ini_set("session.cookie_secure", "True"); //secureini_set("session.cookie_httponly", "True"); //httponlysession_set_cookie_params(3, '/', '.localhost');
//This cookie is valid for 3 seconds (max age)// “/” ensures that this cookie is valid on all //paths of this domain// since the domain is prefixed with dot, this
//cookie is accessible from all the subdomains. session_start();
重新加載該頁面,看看響應頭
HTTP/1.1 200 OKDate: Thu, 30 Apr 2015 03:04:11 GMTServer: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0X-Powered-By: PHP/5.6.2Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheSet-Cookie: PHPSESSID=f4d99777d9810bfedb6869acd556bc66;
expires=Thu, 30-Apr-2015 03:04:14 GMT;
Max-Age=3; path=/; domain=.localhost; secure; HttpOnlyX-XSS-Protection: 1Content-Security-Policy: script-src 'self'Content-Length: 820Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=UTF-8
在本文中,我們瞭解瞭如何使用HTTP頭保衛我們的Cookies。雖說這些頭可以幫助我們提高WEB應用的安全,但是我們不能完全依賴這些頭來保護我們的WEB安全,我們應該考慮使用添加額外的安全層。