守好Bean的入口
注意到property="*"了嗎?這表明用戶(hù)在可見(jiàn)的JSP頁(yè)面中輸入的,或是直接通過(guò)Query String提交的全部變量的值,將存儲到匹配的bean屬性中。
用戶(hù)是這樣提交請求的:
http://www.somesite.com /addToBasket.jsp?newItem=ITEM0105342
但是不守規矩的用戶(hù)呢?他們可能會(huì )提交:
http://www.somesite.com /addToBasket.jsp?newItem=ITEM0105342&balance=0
這樣,balance=0的信息就被在存儲到了JavaBean中了。當他們這時(shí)點(diǎn)擊“chekout”結賬的時(shí)候,費用就全免了。
這與PHP中全局變量導致的安全問(wèn)題如出一轍。由此可見(jiàn):“property="*"”一定要慎用!
String對象帶來(lái)的隱患
Java平臺的確使安全編程更加方便了。Java中無(wú)指針,這意味著(zhù) Java 程序不再像C那樣能對地址空間中的任意內存位置尋址了。在JSP文件被編譯成 .class 文件時(shí)會(huì )被檢查安全性問(wèn)題,例如當訪(fǎng)問(wèn)超出數組大小的數組元素的嘗試將被拒絕,這在很大程度上避免了緩沖區溢出攻擊。但是,String對象卻會(huì )給我們帶來(lái)一些安全上的隱患。如果密碼是存儲在 Java String 對象中的,則直到對它進(jìn)行垃圾收集或進(jìn)程終止之前,密碼會(huì )一直駐留在內存中。即使進(jìn)行了垃圾收集,它仍會(huì )存在于空閑內存堆中,直到重用該內存空間為止。密碼 String 在內存中駐留得越久,遭到竊聽(tīng)的危險性就越大。更糟的是,如果實(shí)際內存減少,則操作系統會(huì )將這個(gè)密碼 String 換頁(yè)調度到磁盤(pán)的交換空間,因此容易遭受磁盤(pán)塊竊聽(tīng)攻擊。為了將這種泄密的可能性降至最低(但不是消除),您應該將密碼存儲在 char 數組中,并在使用后對其置零(String 是不可變的,無(wú)法對其置零)。
線(xiàn)程安全初探
“JAVA能做的,JSP就能做”。與ASP、PHP等腳本語(yǔ)言不一樣,JSP默認是以多線(xiàn)程方式執行的。以多線(xiàn)程方式執行可大大降低對系統的資源需求,提高系統的并發(fā)量及響應時(shí)間。線(xiàn)程在程序中是獨立的、并發(fā)的執行路徑,每個(gè)線(xiàn)程有它自己的堆棧、自己的程序計數器和自己的局部變量。雖然多線(xiàn)程應用程序中的大多數操作都可以并行進(jìn)行,但也有某些操作(如更新全局標志或處理共享文件)不能并行進(jìn)行。如果沒(méi)做好線(xiàn)程的同步,在大并發(fā)量訪(fǎng)問(wèn)時(shí),不需要惡意用戶(hù)的“熱心參與”,問(wèn)題也會(huì )出現。最簡(jiǎn)單的解決方案就是在相關(guān)的JSP文件中加上:
<%@ page isThreadSafe="false" %>
指令,使它以單線(xiàn)程方式執行,這時(shí),所有客戶(hù)端的請求以串行方式執行。這樣會(huì )嚴重降低系統的性能。我們可以仍讓JSP文件以多線(xiàn)程方式執行,通過(guò)對函數上鎖來(lái)對線(xiàn)程進(jìn)行同步。一個(gè)函數加上synchronized 關(guān)鍵字就獲得了一個(gè)鎖。但是這樣仍然會(huì )對系統的性能有一定影響。一個(gè)更好的方案是采用局部變量代替實(shí)例變量。因為實(shí)例變量是在堆中分配的,被屬于該實(shí)例的所有線(xiàn)程共享,不是線(xiàn)程安全的,而局部變量在堆棧中分配,因為每個(gè)線(xiàn)程都有它自己的堆??臻g,所以這樣線(xiàn)程就是安全的了。
如果采用的是實(shí)例變量,那么該實(shí)例變量屬于該實(shí)例的所有線(xiàn)程共享,就有可能出現用戶(hù)A傳遞了某個(gè)參數后他的線(xiàn)程轉為睡眠狀態(tài),而參數被用戶(hù)B無(wú)意間修改,造成好友錯配的現象。
來(lái)源: http://blog.csdn.net/gojava/archive/2005/01/14/254159.aspx
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。