[理論知識]html
咱們在網站開發的過程當中,常常須要會使用到form表單,表單提供了豐富的客戶端與服務器端交互的控件。可是在開發過程當中,咱們須要注意表單的各方面安全性問題,好比防止客戶繞開表單向服務器發送請求(這是一個很危險的現象)。jquery
在咱們學習過的技術中,有不少技術都是爲了確保表單的安全性,好比驗證碼技術(雖然它是一個對於普通用戶很不友好的東西)。小程序
在本系列文章中,小博老師就爲你們講解表單安全性的另外一個技術——表單令牌(Token)。瀏覽器
[步驟解讀一]無令牌表單安全
相信你們對於普通form表單與服務器的交互已經很是熟悉了,小博老師這裏就不浪費篇幅多作介紹了,咱們新建一個jsp文件提供用戶填寫信息的表單,核心代碼以下:服務器
<form action="BWFToken" method="POST">jsp
帳戶名稱:<input type="text" name="username"/><br/><br/>post
帳戶密碼:<input type="password" name="userpass"/><br/><br/>學習
<input type="submit" value="登 錄"/>網站
</form>
而後咱們再建立一個Servlet來接受表單提交的數據,核心代碼以下:
@WebServlet("/BWFToken")
public class BWFTokenServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
out.println("username="+username+",userpass="+userpass);
}
}
這樣,咱們經過瀏覽器訪問jsp頁面,效果以下:
填寫帳戶名稱和帳戶密碼,提交給Servlet後,效果以下:
[步驟解讀二]用戶繞開表單
以上是一個最普通的表單和服務器交互的案例,這樣的表單是存在必定風險的,用戶徹底能夠繞開表單直接向服務器發送請求。
首先咱們訪問jsp頁面,而後在瀏覽器中右鍵、查看源代碼,結果以下:
從源代碼中用戶能夠獲得幾個關鍵信息。action="BWFToken",這個屬性結合上當前jsp頁面的url,用戶能夠得知服務器接收表單提交數據的url爲「http://127.0.0.1:8090/BWF-JavaEE/BWFToken」。method="POST",從這個屬性用戶能夠得知表單提交的方式爲POST請求。<input type="text" name="username"/>和<input type="password" name="userpass"/>,這兩個表單控件的源代碼告訴了用戶,該表單向服務器提交了兩個參數信息,其key分別爲username和userpass。
結合以上信息,用戶能夠輕鬆本身編寫一個任意形式的小程序,繞開表單直接向服務器的Servlet發送請求。這種小程序能夠是一個Applet,也能夠是一個html頁面,甚至是一個Ajax等等。
好比,小博老師爲你們演示一下使用Ajax技術繞開表單直接向服務器的Servlet發送請求,核心代碼以下:
<body>
<script src="script/jquery-1.4.2.min.js"></script>
<script>
$(document).ready(function(){
var username = "attacter";
var userpass = "crack";
$.post(
"http://127.0.0.1:8090/BWF-JavaEE/BWFToken",
"username="+username+"&userpass="+userpass,
function(data){
alert(data);
}
);
});
</script>
</body>
咱們使用瀏覽器訪問該頁面,效果以下: