亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP安全編程實例淺析

2019-11-18 16:34:56
字體:
來源:轉載
供稿:網友

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="*"”一定要慎用!
三、長盛不衰的跨站腳本

  跨站腳本(Cross Site Scripting)攻擊是指在遠程WEB頁面的HTML代碼中手插入惡意的Javascript, VBScript, ActiveX, HTML, 或Flash等腳本,竊取瀏覽此頁面的用戶的隱私,改變用戶的設置,破壞用戶的數據??缯灸_本攻擊在多數情況下不會對服務器和WEB程序的運行造成影響,但對客戶端的安全構成嚴重的威脅。

  以仿動網的阿菜論壇(beta-1)舉個最簡單的例子。當我們提交

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>alert(document.cookie)</script> 

  便能彈出包含自己cookie信息的對話框。而提交

  就能重定向到網易。

  由于在返回“name”變量的值給客戶端時,腳本沒有進行任何編碼或過濾惡意代碼,當用戶訪問嵌入惡意“name”變量數據鏈接時,會導致腳本代碼在用戶瀏覽器上執行,可能導致用戶隱私泄露等后果。比如下面的鏈接:

  xxx.xxx用于收集后邊跟的參數,而這里參數指定的是document.cookie,也就是訪問此鏈接的用戶的cookie。在ASP世界中,很多人已經把偷cookie的技術練得爐火純青了。在JSP里,讀取cookie也不是難事。當然,跨站腳本從來就不會局限于偷cookie這一項功能,相信大家都有一定了解,這里就不展開了。

  對所有動態頁面的輸入和輸出都應進行編碼,可以在很大程度上避免跨站腳本的攻擊。遺憾的是,對所有不可信數據編碼是資源密集型的工作,會對 Web 服務器產生性能方面的影響。常用的手段還是進行輸入數據的過濾,比如下面的代碼就把危險的字符進行替換:

<% String message = request.getParameter("message");
message = message.replace ('<','_');
message = message.replace ('>','_');
message = message.replace ('"','_');
message = message.replace ('/'','_');
message = message.replace ('%','_');   [轉自:51item.net] 
message = message.replace (';','_');
message = message.replace ('(','_');
message = message.replace (')','_');
message = message.replace ('&','_');
message = message.replace ('+','_'); %> 

  更積極的方式是利用正則表達式只允許輸入指定的字符:

public boolean isValidInput(String str)
{
 if(str.matches("[a-z0-9]+")) return true;
 else return false;

  四、時刻牢記SQL注入

  一般的編程書籍在教初學者的時候都不注意讓他們從入門時就培養安全編程的習慣。著名的《JSP編程思想與實踐》就是這樣向初學者示范編寫帶數據庫的登錄系統的(數據庫為MySQL):

Statement stmt = conn.createStatement();
String checkUser = "select * from login where username = '" + userName + "' and userpassWord = '" + userPassword + "'";
ResultSet rs = stmt.executeQuery(checkUser);
if(rs.next())
 response.sendRedirect("SuccessLogin.jsp");
else
 response.sendRedirect("FailureLogin.jsp"); 

  這樣使得盡信書的人長期使用這樣先天“帶洞”的登錄代碼。如果數據庫里存在一個名叫“jack”的用戶,那么在不知道密碼的情況下至少有下面幾種方法可以登錄:

用戶名:jack
密碼:' or 'a'='a
用戶名:jack
密碼:' or 1=1/*
用戶名:jack' or 1=1/*
密碼:(任意)
lybbs(凌云論壇)ver 2.9.Server在LogInOut.java中是這樣對登錄提交的數據進行檢查的:
if(s.equals("") ││ s1.equals(""))
throw new UserException("用戶名或密碼不能空。");
if(s.indexOf("'") != -1 ││ s.indexOf("/"") != -1 ││ s.indexOf(",") != -1 ││ s.indexOf("http://") != -1)
throw new UserException("用戶名不能包括 ' /" // , 等非法字符。");
if(s1.indexOf("'") != -1 ││ s1.indexOf("/"") != -1 ││ s1.indexOf("*") != -1 ││ s1.indexOf("http://") != -1)
throw new UserException("密碼不能包括 ' /" // * 等非法字符。");
if(s.startsWith(" ") ││ s1.startsWith(" "))
throw new UserException("用戶名或密碼中不能用空格。"); 

  但是我不清楚為什么他只對密碼而不對用戶名過濾星號。另外,正斜杠似乎也應該被列到“黑名單”中。我還是認為用正則表達式只允許輸入指定范圍內的字符來得干脆。

  這里要提醒一句:不要以為可以憑借某些數據庫系統天生的“安全性”就可以有效地抵御所有的攻擊。pinkeyes的那篇《PHP注入實例》就給那些依賴PHP的配置文件中的“magic_quotes_gpc = On”的人上了一課。

  五、String對象帶來的隱患

  Java平臺的確使安全編程更加方便了。Java中無指針,這意味著 Java 程序不再像C那樣能對地址空間中的任意內存位置尋址了。在JSP文件被編譯成 .class 文件時會被檢查安全性問題,例如當訪問超出數組大小的數組元素的嘗試將被拒絕,這在很大程度上避免了緩沖區溢出攻擊。但是,String對象卻會給我們帶來一些安全上的隱患。如果密碼是存儲在 Java String 對象中的,則直到對它進行垃圾收集或進程終止之前,密碼會一直駐留在內存中。即使進行了垃圾收集,它仍會存在于空閑內存堆中,直到重用該內存空間為止。密碼 String 在內存中駐留得越久,遭到竊聽的危險性就越大。更糟的是,如果實際內存減少,則操作系統會將這個密碼 String 換頁調度到磁盤的交換空間,因此容易遭受磁盤塊竊聽攻擊。為了將這種泄密的可能性降至最低(但不是消除),您應該將密碼存儲在 char 數組中,并在使用后對其置零(String 是不可變的,無法對其置零)。

  六、線程安全初探

  “JAVA能做的,JSP就能做”。與ASP、PHP等腳本語言不一樣,JSP默認是以多線程方式執行的。以多線程方式執行可大大降低對系統的資源需求,提高系統的并發量及響應時間。線程在程序中是獨立的、并發的執行路徑,每個線程有它自己的堆棧、自己的程序計數器和自己的局部變量。雖然多線程應用程序中的大多數操作都可以并行進行,但也有某些操作(如更新全局標志或處理共享文件)不能并行進行。如果沒做好線程的同步,在大并發量訪問時,不需要惡意用戶的“熱心參與”,問題也會出現。最簡單的解決方案就是在相關的JSP文件中加上: <%@ page isThreadSafe="false" %>指令,使它以單線程方式執行,這時,所有客戶端的請求以串行方式執行。這樣會嚴重降低系統的性能。我們可以仍讓JSP文件以多線程方式執行,通過對函數上鎖來對線程進行同步。一個函數加上synchronized 關鍵字就獲得了一個鎖??聪旅娴氖纠?

public class MyClass{
int a;
public Init() {//此方法可以多個線程同時調用
 a = 0;
}
public synchronized void Set() {//兩個線程不能同時調用此方法
 if(a>5) {
  a= a-5;
 }
}

  但是這樣仍然會對系統的性能有一定影響。一個更好的方案是采用局部變量代替實例變量。因為實例變量是在堆中分配的,被屬于該實例的所有線程共享,不是線程安全的,而局部變量在堆棧中分配,因為每個線程都有它自己的堆??臻g,所以這樣線程就是安全的了。比如凌云論壇中添加好友的代碼:

public void addFriend(int i, String s, String s1)
throws DBConnectException
{
 try
 {
  if……
  else
  {
   DBConnect dbconnect = new DBConnect("insert into friend (authorid,friendname) values (?,?)");
   dbconnect.setInt(1, i);
   dbconnect.setString(2, s);
   dbconnect.executeUpdate();
   dbconnect.close();
   dbconnect = null;
  }
 }
 catch(Exception exception)
 {
  throw new DBConnectException(exception.getMessage());
 }

  下面是調用:

friendName=ParameterUtils.getString(request,"friendname");
if(action.equals("adduser")) {
 forumFriend.addFriend(Integer.parseInt(cookieID),friendName,cookieName);
 errorInfo=forumFriend.getErrorInfo();

  如果采用的是實例變量,那么該實例變量屬于該實例的所有線程共享,就有可能出現用戶A傳遞了某個參數后他的線程轉為睡眠狀態,而參數被用戶B無意間修改,造成好友錯配的現象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美一区二区三区久久| 国产精品高潮呻吟久久av无限| 欧美大尺度激情区在线播放| 国产日韩精品视频| 日韩一区av在线| 国产亚洲精品久久久久久777| 亚洲欧美激情在线视频| 成人免费在线网址| 91地址最新发布| 性欧美长视频免费观看不卡| 国产精品久久久久久婷婷天堂| 热门国产精品亚洲第一区在线| 国产精品盗摄久久久| 欧美一级淫片videoshd| 欧美大成色www永久网站婷| 亚洲精品久久久久中文字幕二区| 精品国内自产拍在线观看| 欧美日韩在线一区| 国产精品爽黄69天堂a| 国产精品三级在线| 国产日韩欧美黄色| 欧美成年人视频网站欧美| 成人在线小视频| 久久久久久18| 国产日产欧美精品| 亚洲欧美一区二区三区久久| 国产综合在线看| 国产女人18毛片水18精品| 91国内产香蕉| 亚洲精品视频网上网址在线观看| 91免费的视频在线播放| 亚洲电影免费在线观看| 亚洲性xxxx| 日韩精品中文字幕视频在线| 最好看的2019的中文字幕视频| 国产视频精品一区二区三区| 91久久国产精品91久久性色| 韩剧1988在线观看免费完整版| 国产精选久久久久久| 久久久久久久爱| 久久久久久久久久婷婷| 国产精品专区第二| 日韩国产欧美精品一区二区三区| 国产精品h片在线播放| 伊人精品在线观看| 国产午夜精品全部视频播放| 日韩影视在线观看| 国产精品久久av| 91av在线播放视频| 亚洲成人激情在线观看| 欧美xxxx14xxxxx性爽| 国产欧美日韩91| 在线亚洲午夜片av大片| 久久久久中文字幕| 亚洲视频欧洲视频| 欧美日韩福利视频| 日韩精品免费在线观看| 秋霞成人午夜鲁丝一区二区三区| 久久中文精品视频| 日韩精品电影网| 最近的2019中文字幕免费一页| 欧美体内谢she精2性欧美| 中文字幕日韩欧美精品在线观看| 日本精品在线视频| 日韩av电影在线免费播放| 97久久伊人激情网| 51ⅴ精品国产91久久久久久| 欧美日韩国产一区二区| 成人在线视频网| 日韩av中文在线| 亚洲aⅴ日韩av电影在线观看| 国产91精品最新在线播放| 亚洲国产精品va在线看黑人动漫| 91精品啪aⅴ在线观看国产| 欧美激情一区二区久久久| 色香阁99久久精品久久久| 一本色道久久综合狠狠躁篇怎么玩| 日本久久精品视频| 久久夜精品va视频免费观看| 日韩欧美国产中文字幕| 国产精品久久久| 国产精品视频精品视频| 国产精品人人做人人爽| 欧美高清在线观看| 久久影院资源站| 精品国产视频在线| 国产裸体写真av一区二区| 成人深夜直播免费观看| 成人激情视频在线| 欧美视频一区二区三区…| 国产精品久久久久久久久男| 欧美日韩中文字幕日韩欧美| 精品中文字幕在线观看| 日韩欧美a级成人黄色| 欧美午夜激情视频| 日本一区二三区好的精华液| 欧美老肥婆性猛交视频| 日韩av中文字幕在线| 久久久久久久久网站| 国产精品久久精品| 国产成人久久久| 日韩美女av在线| 亚洲天堂av综合网| 亚洲欧美三级在线| 亚洲影院色无极综合| 欧美色图在线视频| 久久久久国产视频| 欧美激情小视频| 国产精品激情av电影在线观看| 日韩中文字幕在线| 欧美色视频日本版| 国产一区二区三区三区在线观看| 欧美激情视频在线观看| 国产在线精品一区免费香蕉| 欧美洲成人男女午夜视频| 日韩免费观看高清| 久久偷看各类女兵18女厕嘘嘘| 在线看片第一页欧美| 成人黄色av播放免费| 97久久伊人激情网| 姬川优奈aav一区二区| 91精品国产综合久久香蕉的用户体验| 国产va免费精品高清在线观看| 日韩欧美精品网址| 欧美成人免费网| 欧美精品在线视频观看| 日本91av在线播放| 亚洲精品成a人在线观看| 国产精品久久久久久久久影视| 日韩美女在线看| 国产日韩欧美日韩| 色www亚洲国产张柏芝| 亚洲第一精品夜夜躁人人爽| 黄色91在线观看| 欧美日韩在线视频一区| 亚洲国产婷婷香蕉久久久久久| 国产精品一区二区久久国产| 国产综合香蕉五月婷在线| 欧美性生交大片免费| 一区二区三区美女xx视频| 97人人做人人爱| 在线视频中文亚洲| 日本韩国欧美精品大片卡二| 欧美日韩精品国产| 91精品国产自产在线老师啪| 国产99久久精品一区二区永久免费| 亚洲影院高清在线| 久久久久久久影院| 国产欧美欧洲在线观看| 在线看片第一页欧美| 欧美专区福利在线| 亚洲激情第一页| 国产精品一区二区三区免费视频| 影音先锋日韩有码| 国内精品小视频在线观看| 国产男女猛烈无遮挡91| 国产精品电影久久久久电影网| 亚洲男人天堂2023| 日本国产精品视频| 久久九九精品99国产精品| 欧美一级高清免费| 日韩中文字幕在线视频| 亚洲图片制服诱惑| 日韩欧美在线一区|