使用HTTP Headers防禦WEB***

簡介

在用戶會話中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安全,我們應該考慮使用添加額外的安全層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章