| 導購 | 订阅 | 在线投稿
分享
 
 
 

JSP開發者要萬萬小心的數據範圍漏洞

來源:互聯網網民  2006-10-25 07:08:09  評論

JSP開發者要萬萬小心的數據範圍漏洞

不知是很多教科書的懶惰還是其他什麽,總之JSP中的數據定義方式的變量範圍被忽略了。近日的調試才發現這個非常嚴重的問題。大家一起研究一下,因爲這絕對是個嚴重的不能再嚴重的問題了。

JSP中有兩種定義變量的方式,一種是"<%! ... %>"方式,另一種是"<% ... %>"方式。估計幾乎所有的教科書上都是寫<%! ... %>這種定義方式,(by gashero)而大家也就忽略了後一種方式,實際山他們有著非常大的區別,就是在于變量的定義域。查看JSP生成的Servlet代碼可以看到,在<%! ... %>方式生成的變量定義是作爲Servlet的默認成員變量,即沒有public/private等等修飾的成員變量,作用範圍是page。而在<% ... %>中定義的變量則是在Servlet的一個方法中作爲局部變量定義的。正是因爲這麽一點區別就可以造成非常嚴重的錯誤。

page變量的作用範圍是頁面,不僅僅一個用戶每次訪問這個頁面都可以相同的變量值。不同用戶、甚至不在同一台電腦所上的人,訪問這些變量的時候得到的變量值也都相同。所以如果沒有太在意,(by gashero)使用了page變量來保存登錄信息一類的數據,大家可就都爽了。任何人登錄進來都可以做他想做的任何事情。

而使用<% ... %>方式定義的變量則不會有這個問題,即使同一用戶在不同時間、不同窗口訪問同一個頁面,得到的結果也不同。

下面有一個例子,大家可以用Tomcat測試一下。就可以知道這個<%! ... %>所定義的page變量的能量了。程序中爲了簡化設計沒有進行編碼轉換,具體可以參考我的一篇關于Tomcat編碼的帖子。

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>

<%!

String username="";

String password="";

%>

<%

username=request.getParameter("username");

password=request.getParameter("password"); // by gashero

if(username==null) {

username="";

}

if(password==null) {

password="";

}

%>

<html><body>

Username=<%=username %><br>

Password=<%=password %><br>

<br>

<form method="POST" action="test.jsp">

username:<input type="text" name="username"><br>

password:<input type="password" name="password"><br>

<input type="submit" value="提交">

</form>

</body></html>

這是一個再簡單不過的提交表單,讀者可以自己試著提交一次數據,然後另外開一個浏覽器頁面,再次查看相同的URL,會發現用戶名和密碼還好好的在那裏顯示著。可以試著換一個浏覽器,看看,(by gashero)用戶名和密碼還在那裏。再換一台電腦試試,用戶名和密碼還在。

這是很多JSP書籍所忽略的一個問題,相信很多JSP初學者也會在這裏栽跟頭,但願本文對大家有用。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
JSP開發者要萬萬小心的數據範圍漏洞 不知是很多教科書的懶惰還是其他什麽,總之JSP中的數據定義方式的變量範圍被忽略了。近日的調試才發現這個非常嚴重的問題。大家一起研究一下,因爲這絕對是個嚴重的不能再嚴重的問題了。 JSP中有兩種定義變量的方式,一種是"<%! ... %>"方式,另一種是"<% ... %>"方式。估計幾乎所有的教科書上都是寫<%! ... %>這種定義方式,(by gashero)而大家也就忽略了後一種方式,實際山他們有著非常大的區別,就是在于變量的定義域。查看JSP生成的Servlet代碼可以看到,在<%! ... %>方式生成的變量定義是作爲Servlet的默認成員變量,即沒有public/private等等修飾的成員變量,作用範圍是page。而在<% ... %>中定義的變量則是在Servlet的一個方法中作爲局部變量定義的。正是因爲這麽一點區別就可以造成非常嚴重的錯誤。 page變量的作用範圍是頁面,不僅僅一個用戶每次訪問這個頁面都可以相同的變量值。不同用戶、甚至不在同一台電腦所上的人,訪問這些變量的時候得到的變量值也都相同。所以如果沒有太在意,(by gashero)使用了page變量來保存登錄信息一類的數據,大家可就都爽了。任何人登錄進來都可以做他想做的任何事情。 而使用<% ... %>方式定義的變量則不會有這個問題,即使同一用戶在不同時間、不同窗口訪問同一個頁面,得到的結果也不同。 下面有一個例子,大家可以用Tomcat測試一下。就可以知道這個<%! ... %>所定義的page變量的能量了。程序中爲了簡化設計沒有進行編碼轉換,具體可以參考我的一篇關于Tomcat編碼的帖子。 <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %> <%! String username=""; String password=""; %> <% username=request.getParameter("username"); password=request.getParameter("password"); // by gashero if(username==null) { username=""; } if(password==null) { password=""; } %> <html><body> Username=<%=username %><br> Password=<%=password %><br> <br> <form method="POST" action="test.jsp"> username:<input type="text" name="username"><br> password:<input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body></html> 這是一個再簡單不過的提交表單,讀者可以自己試著提交一次數據,然後另外開一個浏覽器頁面,再次查看相同的URL,會發現用戶名和密碼還好好的在那裏顯示著。可以試著換一個浏覽器,看看,(by gashero)用戶名和密碼還在那裏。再換一台電腦試試,用戶名和密碼還在。 這是很多JSP書籍所忽略的一個問題,相信很多JSP初學者也會在這裏栽跟頭,但願本文對大家有用。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有