[步驟解讀三]添加表單令牌算法
這種用戶繞開表單的狀況是很是危險的,好比用戶能夠本身編寫一個小程序,循環向服務器發送屢次請求,使用窮舉算法暴力破解密碼。所以這種現象咱們在編程中要千方百計防止。編程
爲了防止這種用戶繞開表單的現象,咱們能夠在服務器生成一個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發送請求: