小博老師解析Java核心技術點 ——表單令牌(二)

[步驟解讀三]添加表單令牌算法

這種用戶繞開表單的狀況是很是危險的,好比用戶能夠本身編寫一個小程序,循環向服務器發送屢次請求,使用窮舉算法暴力破解密碼。所以這種現象咱們在編程中要千方百計防止。編程

爲了防止這種用戶繞開表單的現象,咱們能夠在服務器生成一個UUID(全局惟一標識)做爲令牌,存放在表單的隱藏域中,同時在Session中也存放一份。當表單提交給服務器時,服務器判斷表單提交的令牌數據,是否和Session中存放的數據一致。而且每次會話都會隨機生成新的令牌,所以用戶就沒法繞開表單而循環屢次向服務器發送請求了。小程序

接下來,小博老師就爲你們演示一下如何簡單製做表單令牌的過程,首先咱們修改jsp頁面,核心代碼以下:瀏覽器

<body>服務器

<% session

UUID uuid = UUID.randomUUID();dom

session.setAttribute("BWFToken", uuid.toString());jsp

%>測試

<form action="BWFToken" method="POST">ui

帳戶名稱:<input type="text" name="username"/><br/><br/>

帳戶密碼:<input type="password" name="userpass"/><br/><br/>

<input type="hidden" name="BWFToken" value="<%= session.getAttribute("BWFToken")%>"/>

<input type="submit" value="登  錄"/>

</form>

</body>

咱們經過瀏覽器訪問jsp頁面,而後右鍵、查看源代碼:

發現表單中增長了一個隱藏域,其值就是令牌的數據,而且屢次刷新頁面,這個令牌值每次都不同的(若是須要,能夠再次進行加密)。

接下來咱們修改Servlet中的功能,優先校驗表單令牌數據,核心代碼以下:

@WebServlet("/BWFToken")

public class BWFTokenServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

PrintWriter out = response.getWriter();

 

// 校驗令牌數據

if(  request.getSession().getAttribute("BWFToken") == null || request.getParameter("BWFToken") ==null || request.getSession().getAttribute("BWFToken").toString().equals( request.getParameter("BWFToken") ) == false ){

// 令牌校驗失敗  給出提示信息

out.println("Your token has error!");

return;

}

 

String username = request.getParameter("username");

String userpass = request.getParameter("userpass");

 

out.println("username="+username+",userpass="+userpass);

}

}

至此,簡單的表單令牌效果已經制做完成了,咱們來測試一下。首先咱們經過jsp頁面向服務器Servlet發送請求,令牌數據校驗正確:

而後咱們再使用以前編寫的小程序,利用Ajax向服務器Servlet發送請求:

相關文章
相關標籤/搜索