一、了解驗證機制
Web應用的安全性措施主要包含下面4個方面:
1、身份驗證
對安全性的第一個基本要求是驗證使用者。驗證是識别一個人或一個系統以及檢驗其資格的過程。在Internet領域,驗證一個使用者的基本方法是使用者名和密碼。
2、授權
一旦使用者通過驗證,還必須給它授權,授權是确定使用者是否被允許通路它所請求的資源的過程。例如,在銀行系統中,你隻能通路你的銀行賬戶,不能通路别人的銀行賬戶。授權通常是通過一個通路控制清單(Access Control List,ACL)而強制實施的,該清單制訂了使用者和他所通路額度資源類型。
3、資料完整性
資料完整性是指從發送者傳輸到接受者的過程資料不被破壞。例如,你發送一個請求要從一個賬戶轉1000到另一個賬戶,那麼銀行得到的請求是轉賬1000而不是2000.資料的完整性是通過資料一起發送一個哈希碼或簽名保證的。在接收端需要驗證資料或哈希碼。
4、資料保密性
資料保密性是保證除了應該通路它的使用者外,别人不能通路敏感資訊。例如,當你發送使用者名/密碼登入某個Web站點,如果Internet上是以普通文本形式傳輸的,黑客就可以通過分析HTTP包來獲得這些資訊。在這種情況下,資料就不具有保密性了。保密性通常是通過對資訊的加密來實作的,這樣隻有應該獲得資訊的使用者才能解密。目前,大多數Web站點使用HTTPS協定來對資訊加密,這樣,即使黑客分析資料,也不能對他解密,是以也不能使用它。
授權與保密的差別是二者對資訊保護的方式不同。授權是首先防止資訊到達無權通路的使用者,而保密是保證即使資訊被非法獲得,也不能被使用。
二、驗證的類型
在Servlet規範中定義了如下四種使用者驗證機制:①HTTP Basic驗證;②HTTP Digest驗證;③HTTPS Client驗證;④HTTP FORM-based驗證。
這些驗證機制都是基于使用者名/密碼的機制,在該機制中,伺服器維護一個所有使用者名和密碼的清單以及需要保護的資源清單。
1、HTTP Basic驗證
這種驗證成為HTTP基本驗證,它是由HTTP1.1規範定義的,這是一種保護資源的最簡單和最常用的驗證機制。當浏覽器請求任何受保護資源時,伺服器都要求一個使用者名和密碼。如果使用者輸入了一個合法的使用者名和密碼,伺服器才發送資源。
HTTP基本驗證的優點是:實作較容易,所有的浏覽器都支援。缺點是:因為使用者名和密碼沒有被加密,而是采用Base64編碼,是以是不安全的;不能自定義對話框的外觀。
2、HTTP Digest驗證
這種驗證稱為HTTP摘要驗證,它除了密碼是以加密的方式發送,其他與基本驗證都一樣,但比基本驗證全。
HTTP摘要驗證的優點有:比基本驗證安全;缺點:隻能被IE5以上版本支援;許多Servlet容器不支援,因為規範并沒有強制要求。
3、FORM-based驗證
這種驗證稱為基本表單的驗證,它類似于基本驗證,但它使用使用者自定義的表單來獲得使用者名和密碼而不是使用浏覽器的彈出對話框。開發人員必須建立表單的HTTP頁面,對表單外觀可以定制。
基本驗證表單的優點是:所有的浏覽器都支援,而容易實作。客觀可以定制登入頁面的外觀。缺點是:它不是安全的,使用者名/密碼沒有加密。
4、HTTPS Client驗證
這種驗證稱為客戶證書驗證。它采用HTTPS傳輸資訊。HTTPS是在安全套接層(Secure Socket Layer,SSL)之上的HTTP,SSL可以保證Internet上敏感資料傳輸的保密性。在這樣機制中,當浏覽器和伺服器之間建立起SSL連接配接後,所有資料都以加密的形式傳輸。
優點:它是4中驗證類型中最安全的,所有常用浏覽器都支援;缺點:它需要一個證書授權機構(如VeriSign)的證書;它的實作和維護的成本較高。
三、基本驗證的過程
現在來詳細看一下客戶請求一個受保護資源時,浏覽器和Web容器之間是怎麼樣實作身份驗證的。
(1)浏覽器向某個受保護的資源發送請求,此時浏覽器并不知道資源是受保護的,是以它發送的一個請求是一般的HTTP請求,例如:
GET/login.do/1.1
(2)當伺服器接受對資源的請求後,首先在通路控制清單ACL中檢視該資源是否受保護的,若不是,伺服器将資源發送給使用者。若發現該資源是受保護的,它并不直接發送資源,而是向客戶發送一個401 Unauthorized(非授權)消息。在該消息中包含一個響應頭告訴浏覽器通路該資源需要驗證。響應消息中還包括驗證方法安全域名稱以及請求内容的長度和類型。下面是伺服器發送的一個響應案例:
HTTP/1.1 401 Unauthorized
Server:Tomcat/7.0.39
WWW - Authenticate:Basec realm = "Security Test"
Content - Length = 500
Content - Type = text/html
(3) 當浏覽器收到上面的響應,打開一個對話框提示使用者輸入使用者名和密碼。
(4) 使用者一旦輸入了使用者名和密碼并單擊“确定”按鈕,浏覽器再次發送并在名為Authorization的請求頭中傳遞使用者名和密碼的值,如:
GET/account.do HTTP/1.1
Authorization:Basic bWFyeTptbW0 =
上面請求頭中包含使用者名和密碼串的Base 64編碼值。注意,Base64 編碼不是一種加密的方法。使用sun.misc.Base64Encoder和sun.misc.Base64Decoder類可以對任何字元串編碼和解碼。
(5) 當伺服器接受該請求,它将在通路控制清單ACL檢驗使用者名和密碼,如果是合法的使用者而且該使用者可以通路該資源,它将發送資源并在浏覽器中顯示出來,否則将再一次發送401 Unauthorized消息,浏覽器再次顯示使用者名/密碼對話框。