3.4 Web服務器技術
Web服務器技術主要包括服務器、CGI、Servlet、PHP、ASP、ASP.NET和JSP技術。服務器包括服務器操作系統的選擇和Web服務器的選擇,前面已經介紹,在此不再贅述。
3.4.1 PHP
PHP即“超文本預處理器”,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl及PHP自創的語法,利于學習,使用廣泛,主要適用于Web開發領域。
根據動態網站要求,PHP語言作為一種語言程序,其專用性逐漸在應用過程中顯現,其技術水平的優劣與否將直接影響網站的運行效率。其特點是具有公開的源代碼,在程序設計上與通用型語言(如C語言)相似性較高,因此在操作過程中簡單易懂,可操作性強。同時,PHP語言具有較高的數據傳送處理水平和輸出水平,可以廣泛應用在Windows系統及各類Web服務器中。
PHP可以與很多主流的數據庫建立起連接,如MySQL、ODBC和Oracle等,PHP是利用編譯的不同函數與這些數據庫建立起連接的,PHPLIB就是常用的為一般事務提供的基庫。在PHP語言的使用中,可以分別使用面向過程和面向對象,而且可以將PHP面向過程和面向對象兩者一起混用,這是其他很多編程語言做不到的。
PHP安全加固主要涉及以下幾個方面。
(1)關閉全局變量
如果開啟全局變量會使一些表單提交的數據被自動注冊為全局變量,代碼如下:

如果開啟了全局變量,則服務器端PHP腳本可以用$username和$password來獲取用戶名和密碼,這會造成極大的腳本注入危險。
開啟方法是在php.ini中作如下修改:

建議將其關閉,參數如下:

當全局變量關閉后,就只能從$_POST、$_GET和$_REQUEST中獲取相關參數。
(2)文件系統限制
可以通過open_basedir來限制PHP可以訪問的系統目錄。
如果不限制,使用下面的腳本代碼(hack.php)可以獲取系統密碼。

如果設置了限制,則會報如下錯誤,讓系統目錄不會被非法訪問。

設置文件系統限制的方法如下:

(3)屏蔽PHP錯誤輸出
在/etc/php.ini(默認配置文件位置)中將如下配置值修改為Off:

不要將錯誤堆棧信息直接輸出到網頁上,防止黑客利用相關信息。
(4)屏蔽PHP版本
默認情況下PHP版本會顯示在返回頭中,如:

將php.ini中如下的配置值修改為Off:

(5)打開PHP的安全模式
PHP的安全模式是非常重要的內嵌的安全機制,能夠控制一些PHP中的函數,如system()。同時把很多文件操作函數進行了權限控制,也不允許某些包含關鍵字的文件,如/etc/passwd,但是默認的php.ini是沒有打開安全模式的,打開方法如下:

(6)打開magic_quotes_gpc來防止SQL注入
SQL注入是非常危險的,會使網站后臺被入侵,甚至整個服務器淪陷,所以一定要小心。php.ini中有一項設置如下:

此項默認是關閉的,如果將其打開則自動把用戶提交對SQL的查詢進行轉換,如把'轉為\'等,這對防止SQL注入有很大作用,推薦設置為:

3.4.2 JSP
JSP即Java Server Pages,是由Sun Microsystems公司主導創建的一種動態網頁技術標準。JSP部署于網絡服務器上,可以響應客戶端發送的請求,并根據請求內容動態地生成HTML、XML或其他格式文檔的Web網頁,然后返回給請求者。JSP技術以Java語言作為腳本語言,為用戶的HTTP請求提供服務,并能與服務器上的其他Java程序共同處理復雜的業務需求。
JSP將Java代碼和特定變動內容嵌入靜態的頁面中,實現以靜態頁面為模板,動態生成其中的部分內容。JSP引入了被稱為“JSP動作”的XML標簽,用來調用內建功能。另外,可以創建JSP標簽庫,然后像使用標準HTML或XML標簽一樣使用它們。標簽庫能增強功能和服務器性能,而且不受跨平臺問題的限制。JSP文件在運行時會被其編譯器轉換成更原始的Servlet代碼。JSP編譯器可以把JSP文件編譯成用Java代碼編寫的Servlet,然后由Java編譯器來編譯成能快速執行的二進制機器碼,也可以直接編譯成二進制碼。
JSP安全中出現的源代碼暴露、遠程程序執行等問題,主要通過在服務器軟件網站下載安裝最新的補丁來解決。
3.4.3 ASP/ASP.NET
ASP即Active Server Pages,是Microsoft公司開發的服務器端腳本環境,可用來創建動態交互式網頁并建立強大的Web應用程序。當服務器收到對ASP文件的請求時,它會處理包含在用于構建發送給瀏覽器的HTML網頁文件中的服務器端的腳本代碼。除服務器端腳本代碼外,ASP文件也可以包含文本、HTML(包括相關的客戶端腳本)和COM組件調用。
ASP簡單、易于維護,是小型頁面應用程序的選擇,在使用分布式組件對象模型(Distributed Component Object Model,DCOM)和微軟事務處理服務器(Microsoft Transaction Server,MTS)的情況下,ASP甚至可以實現中等規模的企業應用程序。
ASP.NET又稱為ASP+,不僅是ASP的簡單升級,還是微軟公司推出的新一代腳本語言。ASP.NET基于.NET Framework的Web開發平臺,不但吸收了ASP以前版本的最大優點并參照Java、VB語言的開發優勢加入了許多新的特色,同時也修正了之前的ASP版本的運行錯誤。
ASP.NET具備開發網站應用程序的一切解決方案,包括驗證、緩存、狀態管理、調試和部署等全部功能。在代碼撰寫方面的特色是將頁面邏輯和業務邏輯分開,它分離程序代碼與顯示的內容,讓豐富多彩的網頁更容易撰寫。同時使程序代碼看起來更潔凈、更簡單。
ASP/ASP.NET安全加固主要涉及以下幾個方面。
1)保護Windows的設置包括使用NTFS格式,選擇安全的口令,重新設置管理員賬戶、重新命名或重新建立,刪除不必要的共享和設置ACL等。
2)設置Windows安全性,使用微軟提供的模板。
3)在ASP.NET的web.config中使用URL授權,可以允許或拒絕。
4)ASP.NET賬戶默認該用戶只擁有本地USERS組的權限。
3.4.4 CGI
公共網關接口(Common Gateway Interface,CGI)是Web服務器運行時外部程序的規范,按CGI編寫的程序可以擴展服務器功能。CGI應用程序能與瀏覽器進行交互,還可通過數據API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據,格式化為HTML文檔后,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括C、C++、Java、VB和Delphi等。CGI分為標準CGI和間接CGI兩種。標準CGI使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信采用標準輸入、輸出方式。間接CGI又稱緩沖CGI,在CGI程序和CGI接口之間插入一個緩沖程序,緩沖程序與CGI接口間用標準輸入、輸出進行通信。
CGI安全加固主要涉及以下幾個方面。
● 使用最新版本的Web服務器,安裝最新的補丁程序,正確配置服務器。
● 按照幫助文件正確安裝CGI程序,刪除不必要的安裝文件和臨時文件。
● 使用C語言編寫CGI程序時,使用安全的函數。
● 使用安全有效的驗證用戶身份的方法。
● 驗證用戶的來源,防止用戶短時間內過多動作。
● 注意處理好意外情況。
● 實現功能時制定安全合理的策略。
● 培養良好的編程習慣。
● 科學嚴謹的治學態度,避免“想當然”的錯誤。
3.4.5 Servlet
Servlet是用Java編寫的服務器端程序,具有獨立于平臺和協議的特性,主要功能在于交互式地瀏覽和生成數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類。一般情況下,人們按廣義的Servlet來理解其定義。Servlet運行于支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基于HTTP的Web服務器。
服務器上需要一些根據用戶輸入訪問數據庫的程序,這些程序通常是使用CGI應用程序完成的。若要在服務器上運行Java,這些程序可使用Java編程語言實現。在通信量大的服務器上,JavaServlet的優點是它們的執行速度快于CGI程序,各個用戶請求被激活成單個程序中的一個線程,而無需創建單獨的進程,這意味著服務器端處理請求的系統開銷將明顯降低。
Servlet安全加固主要涉及以下幾個方面。
一般來說,Servlet會部署到Internet上,因此需要考慮安全性。可以制定Servlet的安全模式,如角色、訪問控制和鑒權等,這些可以用annotation或web.xml進行配置。
@ServletSecurity定義了安全約束,它可以添加在Servlet實現類上,這樣對Servlet中的所有方法都生效,也可以單獨添加在某個doXXX方法上,這樣只針對此方法有效。容器會強制調整doXXX方法被指定角色的用戶調用。
Java代碼舉例:

在上面的代碼段中,@HttpMethodConstraint定義了doGet方法只能被角色為R2的用戶調用,doPost方法只能被角色為R3或R4的用戶調用。@HttpConstraint定義了其他的所有方法都能被角色為R1的用戶調用。角色與用戶映射容器的角色和用戶。
安全約束也可以使用web.xml中的<security-constraint>元素來定義。在此元素中,使用<web-resource-collection>元素來指定HTTP操作和Web資源,元素<auth-constraint>用來指定可以訪問資源的角色,<user-data-constraint>元素中使用<transport-guarantee>元素來指定客戶端和服務器端的數據應該怎樣被保護。
xml代碼舉例:

上面這段部署描述符表示:在/account/* URL上使用GET請求會受到保護,訪問的用戶必須是manager角色,并且需要保證數據的完整性。所有GET之外的其他HTTP請求都不會受到保護。