方法一 靜態(tài)超鏈接
這是目前網(wǎng)站中使用得較多的方法,也最簡(jiǎn)單。在要求使用SSL進(jìn)行傳輸的Web網(wǎng)頁(yè)鏈接中直接標明使用HTTPS協(xié)議,以下是指向需要使用SSL的網(wǎng)頁(yè)的超鏈接:
<a href=“HTTPS://192.168.100.100/ok/securePage.jsp”>SSL例子</a>
需要說(shuō)明的是,在網(wǎng)頁(yè)里的超鏈接如果使用相對路徑的話(huà),其默認啟用協(xié)議與引用該超鏈接的網(wǎng)頁(yè)或資源的傳輸協(xié)議相同,例如在某超鏈接“HTTPS://192.168.100.100/ok/login.jps”的網(wǎng)頁(yè)中包含如下兩個(gè)超鏈接:
<a href=“./bessl/exam.jsp”>SSL鏈接</a>
<a href=“HTTP://192.168.100.100/notssl/index.jsp”>非SSL鏈接</a>
那么,第一個(gè)鏈接使用與“HTTPS://192.168.100.100/ok/login.jsp”相同的傳輸協(xié)議HTTPS,第二個(gè)鏈接使用本身所標識的協(xié)議HTTP。
使用靜態(tài)超鏈接的好處是容易實(shí)現,不需要額外開(kāi)發(fā)。然而,它卻不容易維護管理; 因為在一個(gè)完全使用HTTP協(xié)議訪(fǎng)問(wèn)的Web應用里,每個(gè)資源都存放在該應用特定根目錄下的各個(gè)子目錄里,資源的鏈接路徑都使用相對路徑,這樣做是為了方便應用的遷移并且易于管理。但假如該應用的某些資源要用到HTTPS協(xié)議,引用的鏈接就必須使用完整的路徑,所以當應用遷移或需要更改URL中所涉及的任何部分如:域名、目錄、文件名等,維護者都需要對每個(gè)超鏈接修改,工作量之大可想而知。再者,如果客戶(hù)在瀏覽器地址欄里手工輸入HTTPS協(xié)議的資源,那么所有敏感機密數據在傳輸中就得不到保護,很容易被黑客截獲和篡改!
方法二 資源訪(fǎng)問(wèn)限制
為了保護Web應用中的敏感數據,防止資源的非法訪(fǎng)問(wèn)和保證傳輸的安全性,Java Servlet 2.2規范定義了安全約束(Security-Constraint)元件,它用于指定一個(gè)或多個(gè)Web資源集的安全約束條件;用戶(hù)數據約束(User-Data-Constraint)元件是安全約束元件的子類(lèi),它用于指定在客戶(hù)端和容器之間傳輸的數據是如何被保護的。用戶(hù)數據約束元件還包括了傳輸保證(Transport-Guarantee)元件,它規定了客戶(hù)機和服務(wù)器之間的通信必須是以下三種模式之一:None、Integral、Confidential。None表示被指定的Web資源不需要任何傳輸保證;Integral表示客戶(hù)機與服務(wù)器之間傳送的數據在傳送過(guò)程中不會(huì )被篡改; Confidential表示數據在傳送過(guò)程中被加密。大多數情況下,Integral或Confidential是使用SSL實(shí)現。
這里以BEA的WebLogic Server 6.1為例介紹其實(shí)現方法,WebLogic是一個(gè)性能卓越的J2EE服務(wù)器,它可以對所管理的Web資源,包括EJB、JSP、Servlet應用程序設置訪(fǎng)問(wèn)控制條款。假設某個(gè)應用建立在Weblogic Server里的/mywebAPP目錄下,其中一部分Servlets、JSPs要求使用SSL傳輸,那么可將它們都放在/mywebAPP/sslsource/目錄里,然后編輯/secureAPP/Web-INF/web.xml文件,通過(guò)對web.xml的設置可達到對Web用戶(hù)實(shí)現訪(fǎng)問(wèn)控制。
當Web用戶(hù)試圖通過(guò)HTTP訪(fǎng)問(wèn)/sslsource目錄下的資源時(shí),Weblogic Server就會(huì )查找web.xml里的訪(fǎng)問(wèn)約束定義,返回提示信息:Need SSL connection to access this resource。資源訪(fǎng)問(wèn)限制與靜態(tài)超鏈接結合使用,不僅繼承了靜態(tài)超鏈接方法的簡(jiǎn)單易用性,而且有效保護了敏感資源數據。然而,這樣就會(huì )存在一個(gè)問(wèn)題: 假如Web客戶(hù)使用HTTP協(xié)議訪(fǎng)問(wèn)需要使用SSL的網(wǎng)絡(luò )資源時(shí)看到彈出的提示信息: Need SSL connection to access this resource,大部分人可能都不知道應該用HTTPS去訪(fǎng)問(wèn)該網(wǎng)頁(yè),造成的后果是用戶(hù)會(huì )放棄訪(fǎng)問(wèn)該網(wǎng)頁(yè),這是Web應用服務(wù)提供商不愿意看到的事情。
方法三 鏈接重定向
綜觀(guān)目前商業(yè)網(wǎng)站資源數據的交互訪(fǎng)問(wèn),要求嚴格加密傳輸的數據只占其中一小部分,也就是說(shuō)在一個(gè)具體Web應用中需要使用SSL的服務(wù)程序只占整體的一小部分。那么,我們可以從應用開(kāi)發(fā)方面考慮解決方法,對需要使用HTTPS協(xié)議的那部分JSPs、Servlets或EJBs進(jìn)行處理,使程序本身在接收到訪(fǎng)問(wèn)請求時(shí)首先判斷該請求使用的協(xié)議是否符合本程序的要求,即來(lái)訪(fǎng)請求是否使用HTTPS協(xié)議,如果不是就將其訪(fǎng)問(wèn)協(xié)議重定向為HTTPS,這樣就避免了客戶(hù)使用HTTP協(xié)議訪(fǎng)問(wèn)要求使用HTTPS協(xié)議的Web資源時(shí),看到錯誤提示信息無(wú)所適從的情況,這些處理對Web客戶(hù)來(lái)說(shuō)是透明的。
實(shí)現思想是:首先創(chuàng )建一個(gè)類(lèi),該類(lèi)方法可以實(shí)現自動(dòng)引導Web客戶(hù)的訪(fǎng)問(wèn)請求使用HTTPS協(xié)議,每個(gè)要求使用SSL進(jìn)行傳輸的Servlets或JSPs在程序開(kāi)始時(shí)調用它進(jìn)行協(xié)議重定向,最后才進(jìn)行數據應用處理。
J2EE提供了兩種鏈接重定向機制。第一種機制是RequestDispatcher接口里的forward()方法。使用MVC(Model-View-Controller)機制的Web應用通常都使用這個(gè)方法從Servlet轉移請求到JSP。但這種轉向只能是同種協(xié)議間的轉向,并不能重定向到不同的協(xié)議。第二種機制是使用HTTPServletReponse接口里的sendRedirect()方法,它能使用任何協(xié)議重定向到任何URL,例如:
BeSslResponse.sendRedirect(“HTTPS://192.168.100.100/order”);
此外,我們還需使用到Java Servlet API中的兩個(gè)方法:ServletRequest接口中的getScheme(),它用于獲取訪(fǎng)問(wèn)請求使用的傳輸協(xié)議;HTTPUtils類(lèi)中的getRequestUrl(),它用于獲取訪(fǎng)問(wèn)請求的URL,要注意的是該方法在Servlet 2.3中已被移到HTTPServletRequest接口。
以下是實(shí)現協(xié)議重定向的基本步驟:
1. 獲取訪(fǎng)問(wèn)的請求所使用的協(xié)議;
2. 如果請求協(xié)議符合被訪(fǎng)問(wèn)的Servlet所要求的協(xié)議,就說(shuō)明已經(jīng)使用HTTPS協(xié)議了,不需做任何處理;
3. 如果不符合,使用Servlet所要求的協(xié)議(HTTPS)重定向到相同的URL。
例如,某Web用戶(hù)使用HTTP協(xié)議訪(fǎng)問(wèn)要求使用HTTPS協(xié)議的資源BeSslServlet,敲入“URL:HTTP://192.168.100.100/BeSslServlet”,在執行BeSslServlet時(shí)首先使用ProcessSslServlet.processSsl()重定向到HTTPS://192.168.100.100/BeSslServlet,然后 BeSslServlet與客戶(hù)瀏覽器之間就通過(guò)HTTPS協(xié)議進(jìn)行數據傳輸。
以上介紹的僅是最簡(jiǎn)單的例子,是為了對這種重定向的方法有個(gè)初步的認識。假如想真正在Web應用中實(shí)現,還必須考慮如下幾個(gè)問(wèn)題:
● 在Web應用中常常會(huì )用到GET或Post方法,訪(fǎng)問(wèn)請求的URL中就會(huì )帶上一些查詢(xún)字串,這些字串是使用getRequesUrl()時(shí)獲取不到的,而且在重定向之后會(huì )丟失,所以必須在重定向之前將它們加入到新的URL里。我們可以使用request.getQueryString()來(lái)獲取GET的查詢(xún)字串,對于Post的Request參數,可以把它們轉換成查詢(xún)串再進(jìn)行處理。
● 某些Web應用請求中會(huì )使用對象作為其屬性,必須在重定向之前將這些屬性保存在該Session中,以便重定向后使用。
● 大多數瀏覽器會(huì )把對同一個(gè)主機的不同端口的訪(fǎng)問(wèn)當作對不同的主機進(jìn)行訪(fǎng)問(wèn),分用不同的Session,為了使重定向后保留使用原來(lái)的Session,必須對應用服務(wù)器的Cookie 域名進(jìn)行相應的設置。
以上問(wèn)題均可在程序設計中解決。
通過(guò)程序自身實(shí)現協(xié)議重定向,就可以把要求嚴格保護的那部分資源與其他普通數據從邏輯上分開(kāi)處理,使得要求使用SSL的資源和不需要使用SSL的資源各取所需,避免浪費網(wǎng)站的系統資源。
聯(lián)系客服