1.基本概念
? ? ?安全問題的產生:
互聯網作為商業交易的工具快速發展,越來越多的公司提供網絡交易服務。很多商業活動在網上進行當前,成千上萬的網民在網上進行各種活動的同時,也在網上傳遞其個人信息每天在網上發生各種各樣的商業活動,如銀行交易、股票交易等為了支持這些應用,我們需要一個健壯、安全的互聯網保障機制。電子商務沒有安全的保障是不可能的。
隨著公司、個人對其資源和隱私的重視度的增加,網絡安全的重要性也日益突出
Servlet規范提供了方法和途徑來實現Web應用程序的安全,在討論實現安全特性之前,先了解以下與安全相關的基本概念
認證
授權
數據完整性
數據私密性
審核
惡意代碼
網站攻擊
認證:
安全的第一個基本要求就是用戶認證
認證是一個鑒別用戶、確認身份的過程,這意味著校驗用戶是否是其所宣稱的身份
例如:用戶名和密碼
是否存在該用戶
提供的用戶名是否與其密碼相符
授權:
用戶認證通過,必須被授權
授權是一個決定用戶是否允許訪問特定資源的過程
例如:普通用戶不可以進行后臺管理功能
?
授權通常被維護在一個訪問控制列表(ACL)中,這個列表指定了用戶及其可以訪問的資源
數據完整性:
數據完整性是一個確保數據從發送端到接收端不受到損害的過程
例如:如果用戶發送一個從其賬戶轉出1000元的請求,銀行系統應該確保轉出的金額是1000元而不是10000元
數據完整性通常由伴隨數據一起發送的一個數字簽名來保證。在接收端,數據簽名獲得校驗。
數據私密性:
??數據私密性是確保只有數據合法訪問者可以訪問敏感信息的過程。如:用戶發送用戶名和密碼登錄網站時,如果這些信息以原始格式發送,在互聯網上傳輸時,網絡黑客完全可能通過監聽HTTP數據包竊取這些敏感信息。在這種情況下,數據無法保證其機密性。
?
審核:
審核是記錄系統中與安全相關的事件,確保對每個用戶的行為有據可查
審核能追蹤到系統發生安全問題的原因,通常是由應用程序產生的日志文件來完成。
惡意代碼:
將引起計算機系統損害的一段代碼稱作惡意代碼
典型的惡意代碼包括病毒、蠕蟲和木馬等
有時系統開發者在編寫程序時會留下一個后門漏洞,這是一個潛在的誤用機會,也稱為惡意代碼
盡管我們不能防止不知名程序員的惡意代碼,但對于內部程序員的一對一審查則可以杜絕系統后門漏洞
網站攻擊:
任何認為有價值的事物均是潛在受攻擊目標,應受到保護。網站是最易遭到攻擊的目標。網站的價值在于其所包含的信息以及其給合法用戶提供的服務
一般存在3種類型的網站攻擊
安全攻擊
偽裝攻擊
服務攻擊
一般存在3種類型的網站攻擊
安全攻擊:通過監聽兩臺機器間的通信來竊取機密信息,通過加密傳輸數據可防止此類攻擊,如使用HTTPS協議進行信道加密
偽裝攻擊:通過改變傳輸的信息來達到惡意企圖。如偽裝IP地址,使用使服務器IP地址發消息給服務器。通過健全的認證機制可以防止此種攻擊
服務攻擊:發送大量假請求使得系統無法有效處理合法的請求,這種偽造的大量假數據包可以使網絡堵塞。通過使用防火墻限制端口和控制網絡通信量,可以防止此類攻擊
2.認證機制
Servlet規范定義了4種認證機制:
HTTP基本認證
HTTP摘要認證
HTTPS客戶端認證
HTTP表單認證
以上4種認證都是基于用戶名/密碼機制,由服務器維護一個所有用戶名和密碼的列表,并且保護該列表資源
?HTTP基本認證:
HTTP基本認證的優點
非常容易構建
所有瀏覽器均支持
HTTP基本認證的缺點
安全性不能保證,因為用戶名和密碼未加密(注意:Base64編碼不是加密方法。sun.misc.Base64 和sun.misc.Base64Decoder類可對字符串編碼和解碼)
無法定制與應用程序相匹配的用戶名和密碼對話框外觀。
?
HTTP摘要認證:
HTTP摘要認證是在基本認證的基礎上密碼是加密發送
HTTP摘要認證的優點
比HTTP基本認證安全
HTTP摘要認證的缺點
僅由微軟的IE瀏覽器支持。因為規范沒有對HTTP摘要認證強制,所以許多Servlet容器不提供支持
?
HTTP客戶認證:
HTTPS就是構建在安全套接字(Secure Socket Layer,SSL)之上的HTTP,
SSL是網景公司開發的,用于確保互聯網上傳輸敏感數據私密性的協議。所有被傳輸的數據采用公開密鑰的加密方式
HTTPS客戶認證的優點
是4種認證中最安全的
被所有瀏覽器支持
HTTPS客戶認證的缺點
需要認證中心頒發的認證書
實現、維護該認證具有較高成本
?
HTTP表單認證:
HTTP表單認證與基本認證很相似。但未使用瀏覽器彈出對話框,而是使用一個HTML的表單來獲取用戶名和密碼。
開發都必須創建一個包含表單的HTML頁面,并可以定制表單外觀。Form表單的唯一要求就是其action屬性必須取值為j_security_check,并提供兩個文本域用于輸入用戶名和密碼(j_username, j_password),除此強制要求外,其他事務均可由開發者自定義
HTTP表單認證的優點
非常容易建立
所有瀏覽器均支持
可以定制登錄窗體的外觀
HTTP表單認證的缺點
不安全,因為用戶名和密碼未加密
只有在使用Cookie維持會話時,才可以使用
定制認證機制:
<tomcat-users><user username="tomcat" password="tomcat" roles="tomcat"/> <user username="role1" password="tomcat" roles="role1"/><user username="both" password="tomcat" roles="tomcat,role1"/> </tomcat-users>
?
權限分配給角色而不是實際用戶 <tomcat-users><user username="tomcat" password="tomcat" roles="tomcat"/> <user username="role1" password="tomcat" roles="role1"/><user username="both" password="tomcat" roles="tomcat,role1"/><user username="john" password="jjj" roles="employee"/> <user username="mary" password="mmm" roles="employee"/> <user username="bob" password="bbb" roles="employee,supervisor"/> </tomcat-users>
在web.xml中定義認證機制 在指定具體認證用戶前,要配置用戶名和密碼,這個步驟取決于具體的Servlet容器 Tomcat服務器是在下面的文件中:<tomcat-root>/conf/tomcat-users.xml
<login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/formlogin.html</form-login-page><form-error-page>/formerror.html</form-error-page></form-login-config></login-config>
<login-config><auth-method>BASIC</auth-method></login-config>
?3.安全聲明
?
開發、部署、使用Web應用程序的通常是不同的人,這就要求開發者有能力非常容易的將Web應用安全需求移交給部署者,部署者也應該有能力定制安全的各個方面而不需要修改代碼
Servlet容器允許我們在Web部署描述符中配置安全需求的細節
??jsp授權方式:
默認情況下,Web應用程序的所有資源允許被任何人訪問
為了對資源進行保護,可以做以下工作來限制對資源的訪問
Web資源集合:鑒別必須受保護的資源
授權限制:鑒別用戶所分配的角色
用戶數據限制:指定發送者和接受者之間傳輸數據的方式
<security-constraint><web-resource-collection><web-resource-name>declarative security test</web-resource-name><url-pattern>/secure</url-pattern><http-method>POST</http-method></web-resource-collection><auth-constraint><role-name>supervisor</role-name></auth-constraint><user-data-constraint><transport-guarantee>NONE</transport-guarantee></user-data-constraint></security-constraint><login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/formlogin.html</form-login-page><form-error-page>/formerror.html</form-error-page></form-login-config></login-config> <security-role><role-name>supervisor</role-name></security-role>
4.安全編程
有時候僅采用聲明的安全機制是不夠的
例如:假設允許一個Servlet被公司所有員工訪問,但是,針對管理層和普通員工該Servlet產生不同的輸出。這在種情況下,Servlet規范允許Servlet擁有處理安全的代碼,Servlet根據用戶所扮演的角色產生相應的輸出。
安全相關API
HttpServletRequest接口提供了3個方法用于識別用戶和角色
String getRemoteUser()
如果用戶通過認證,該方法返回用戶的登錄名稱。否則返回null值
Principal getUserPrincipal()
該方法返回一個包含認證通過用戶的java.security.Principal對象
Boolean isUserInRole(String rolename)
該方法用于判斷用戶是否是指定的角色
了解與安全相關的一些基本概念:認證就是鑒別用戶,授權就是鑒別用戶可以做什么,審核是記錄用戶的行為…
Servlet規范定義了4種認證機制
Servlet規范中安全聲明與安全編程的概念與應用
?