利用ModSecurity 打造網站金鐘罩

2010-10-05
根據統計,因Web運用所產生的安全威脅有日漸增多的趨勢,而Web的安全威脅與其他威脅最大的不同在於,Web的安全威脅通常在於程式設計師的疏失或經驗不足而造成安全漏洞,這與一般只要系統安裝修正程式(Patch)即可修補不同。
若想解除Web的安全威脅,最根本的解決方式在於重新檢視所有的Web程式,即所謂的Code Review,從中找出不安全的程式碼再加以修改,而且有些程式碼的掃描軟體可幫忙程式設計師找出不安全的程式碼。但是Code Review的工程浩大,很不切實際,因此「網路應用程式防火牆」(Web Application Firewall,WAF)應運而生。  

WAF就如同一般防火牆的功能一樣,不過它主要是定位在網站主機的保護上。本文將使用開源碼社群中的最有名的網站伺服器Apache再加上modSecurity模組,來實作一個具有WAF保護的網站伺服器,所需套件如下表所示。

 

靜態網頁與動態網頁  

HTML語言最早是被用來統一描述文件的表示方式,利用<>來描述文字表示方式,如即代表以粗體顯示,其運作方式如下圖所示。

▲網頁讀取的執行過程。

上圖中的網頁伺服器並非絕對必要,讀者利用瀏覽器即可瀏覽相關HTML檔的內容。此種網頁,稱之為「靜態網頁」,靜態網頁就像公佈欄一樣,僅可張貼訊息而無法與使用者有任何互動。但到了電子商務時代後,此種方式已無法符合所需,於是與資訊庫功能結合的「動態網頁」應運而生。「動態網頁」運作流程如下圖所示。  

▲「動態網頁」運作流程。

使用者利用「參數」(如上圖中的帳號及密碼)與網頁程式互動,再使用網頁程式如PHP、ASP至資料庫捉取相關資訊後,動態組成HTML內容再回傳至使用者的瀏覽器上。而相關的Web安全漏洞,絕大多數都是因為網頁程式寫得不夠嚴謹而造成的。在說明Web安全之前,首先來談談Web及資料庫的基本概念。  

Web參數的傳遞  

動態網頁須藉由使用者傳遞參數的內容來執行相關的動作,HTTP通訊協定定義了GET和POST兩種的傳遞方式。GET方式是將參數接在URL後,直接傳遞給網頁程式:

而POST的傳遞方式,則是利用HTML中的標籤將相關的參數傳遞給網頁程式(index.php),以下這段程式碼就是為了傳遞userid與passwd參數至index.php。

 

Session與Cookies  

HTTP是一種無狀態(Stateless)的連接方式,所謂無狀態連接,即表示每次HTTP連接都不會記得上一次連接的狀態。這裡必須思考一個問題:「該如何實作一個Web應用程式的認證(如會員登入)。」有程式經驗的讀者,應該了解在一般的應用程式上這並不是大問題,因為一般的程式,入口只有一個,在執行時,應用程式一定要先執行登入功能,就如同下圖中的Login.frm,通過認證後,方可往下執行相關功能。

▲完成撥號對應表建立。

可是很不幸的是,Web程式具有「超連結」的特性。執行Web程式時,它未必一定要先執行Login.php才能去執行其他程式。它可隨意執行網站伺服器上的任意程式,如上圖中的Web程式流程「http://<網站IP>/」子功能一.php,而不一定要先執行Login.php登入認證後才可執行其他程式。因此,在每個網頁程式中皆須使用檢查認證的程式,來驗證使用者是否有登入。  

但是,這又產生另外一個問題。如前所述,HTTP是一種無狀態的連接方式,即使用戶已通過認證,當重新連接新的網頁程式如子功能一.php,檢查認證的程式該如何來確認使用者已登入呢?這也是Cookies其中的一種重要運用。  

Cookies是一種由網站伺服器傳遞給使用者的小檔案,當使用者通過認證後可由伺服器丟一個認證Cookies至使用者的電腦上,而後檢查認證的程式時,可利用檢查使用者電腦是否存有認證Cookies,來判別使用者是否已登入認證過。  

當然,這只是Cookies的其中一種運用,另一種常見的運用即在於識別,例如讀者連至某些網站後,網站會顯示出上次登入的時間等資訊,即是利用Cookies來完成。  

而Session也是類似的作用,只不過Session是儲存在網站伺服器端,而Cookies則儲存在使用者的電腦上。(更多精彩文章詳見網管人第57期﹚


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!