[步骤解读三]添加表单令牌算法
这种用户绕开表单的状况是很是危险的,好比用户能够本身编写一个小程序,循环向服务器发送屡次请求,使用穷举算法暴力破解密码。所以这种现象咱们在编程中要千方百计防止。编程
为了防止这种用户绕开表单的现象,咱们能够在服务器生成一个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发送请求: