小博老师解析Java核心技术点 ——表单令牌(二)

[步骤解读三]添加表单令牌

这种用户绕开表单的情况是非常危险的,比如用户可以自己编写一个小程序,循环向服务器发送多次请求,使用穷举算法暴力破解密码。因此这种现象我们在编程中要想方设法防止。

为了防止这种用户绕开表单的现象,我们可以在服务器生成一个UUID(全局唯一标识)作为令牌,存放在表单的隐藏域中,同时在Session中也存放一份。当表单提交给服务器时,服务器判断表单提交的令牌数据,是否和Session中存放的数据一致。并且每次会话都会随机生成新的令牌,因此用户就无法绕开表单而循环多次向服务器发送请求了。

接下来,小博老师就为大家演示一下如何简单制作表单令牌的过程,首先我们修改jsp页面,核心代码如下:

<body>

<% 

UUID uuid = UUID.randomUUID();

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

%>

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

账户名称:<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页面,然后右键、查看源代码:

006zipb5zy76DVvukBy08&690

发现表单中增加了一个隐藏域,其值就是令牌的数据,并且多次刷新页面,这个令牌值每次都不一样的(如果需要,可以再次进行加密)。

接下来我们修改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发送请求,令牌数据校验正确:

006zipb5zy76DVyOuCH07&690

然后我们再使用之前编写的小程序,利用Ajax向服务器Servlet发送请求:

006zipb5zy76DVCBmx937&690

转载于:https://my.oschina.net/u/2971691/blog/793054

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值