程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP安全編程實例淺析

JSP安全編程實例淺析

編輯:關於JSP

Java Server Page(JSP)作為建立動態網頁的技術正在不斷升溫。JSP和ASP、PHP、工作機制不太一樣。一般說來,JSP頁面在執行時是編譯式,而不是解釋式的。首次調用JSP文件其實是執行一個編譯為Servlet的過程。當浏覽器向服務器請求這一個JSP文件的時候,服務器將檢查自上次編譯後JSP文件是否有改變,如果沒有改變,就直接執行Servlet,而不用再重新編譯,這樣,效率便得到了明顯提高。

今天我將和大家一起從腳本編程的角度看JSP的安全,那些諸如源碼暴露類的安全隱患就不在這篇文章討論范圍之內了。寫這篇文章的主要目的是給初學JSP編程的朋友們提個醒,從一開始就要培養安全編程的意識,不要犯不該犯的錯誤,避免可以避免的損失。另外,我也是初學者,如有錯誤或其它意見請發帖賜教。

一、認證不嚴——低級失誤

在溢洋論壇v1.12 修正版中,

user_manager.jsp是用戶管理的頁面,作者知道它的敏感性,加上了一把鎖:

if ((session.getValue("UserName")==null)││(session.getValue("UserClass")==null)││(! session.getValue("UserClass").equals("系統管理員")))
{
 response.sendRedirect("err.jsp?id=14");
 return;
}

如果要查看、修改某用戶的信息,就要用modifyuser_manager.jsp這個文件。管理員提交

http://www.somesite.com/yyforum/modifyuser_manager.jsp?modifyid=51

就是查看、修改ID為51的用戶的資料(管理員默認的用戶ID為51)。但是,如此重要的文件竟缺乏認證,普通用戶(包括游客)也直接提交上述請求也可以對其一覽無余(密碼也是明文存儲、顯示的)。modifyuser_manage.jsp同樣是門戶大開,直到惡意用戶把數據更新的操作執行完畢,重定向到user_manager.jsp的時候,他才會看見那個姗姗來遲的顯示錯誤的頁面。顯然,只鎖一扇門是遠遠不夠的,編程的時候一定要不厭其煩地為每一個該加身份認證的地方加上身份認證。

二、守好JavaBean的入口

JSP組件技術的核心是被稱為bean的java組件。在程序中可把邏輯控制、數據庫操作放在javabeans組件中,然後在JSP文件中調用它,這樣可增加程序的清晰度及程序的可重用性。和傳統的ASP或PHP頁面相比,JSP頁面是非常簡潔的,因為許多動態頁面處理過程可以封裝到JavaBean中。

要改變JavaBean屬性,要用到“<jsp:setProperty>”標記。

下面的代碼是假想的某電子購物系統的源碼的一部分,這個文件是用來顯示用戶的購物框中的信息的,而checkout.jsp是用來結帳的。

<jsp:useBean id="myBasket" class="BasketBean">
<jsp:setProperty name="myBasket" property="*"/>
<jsp:useBean>
<html>
<head><title>Your Basket</title></head>
<body>
<p>
You have added the item
<jsp::getProperty name="myBasket" property="newItem"/>
to your basket.
<br/>
Your total is $
<jsp::getProperty name="myBasket" property="balance"/>
Proceed to <a href="checkout.jsp">checkout</a>

注意到property="*"了嗎?這表明用戶在可見的JSP頁面中輸入的,或是直接通過Query String提交的全部變量的值,將存儲到匹配的bean屬性中。

一般,用戶是這樣提交請求的:

http://www.somesite.com /addToBasket.jsp?newItem=ITEM0105342

但是不守規矩的用戶呢?他們可能會提交:

http://www.somesite.com /addToBasket.jsp?newItem=ITEM0105342&balance=0

這樣,balance=0的信息就被在存儲到了JavaBean中了。當他們這時點擊“chekout”結賬的時候,費用就全免了。

這與PHP中全局變量導致的安全問題如出一轍。由此可見:“property="*"”一定要慎用!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved