來源:互聯網網民 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初學者也會在這裏栽跟頭,但願本文對大家有用。