[理论知识]

我们在网站开发的过程中,经常需要会使用到form表单,表单提供了丰富的客户端与服务器端交互的控件。但是在开发过程中,我们需要注意表单的各方面安全性问题,比如防止客户绕开表单向服务器发送请求(这是一个很危险的现象)。

在我们学习过的技术中,有很多技术都是为了确保表单的安全性,比如验证码技术(虽然它是一个对于普通用户很不友好的东西)。

在本系列文章中,小博老师就为大家讲解表单安全性的另一个技术——表单令牌(Token)。

[步骤解读一]无令牌表单

相信大家对于普通form表单与服务器的交互已经非常熟悉了,小博老师这里就不浪费篇幅多做介绍了,我们新建一个jsp文件提供用户填写信息的表单,核心代码如下:

账户名称:

账户密码:

然后我们再创建一个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页面,效果如下:

如何通过onlyoffice的令牌校验 java java令牌是什么意思_服务器

填写账户名称和账户密码,提交给Servlet后,效果如下:

如何通过onlyoffice的令牌校验 java java令牌是什么意思_java 令牌解析_02

[步骤解读二]用户绕开表单

以上是一个最普通的表单和服务器交互的案例,这样的表单是存在一定风险的,用户完全可以绕开表单直接向服务器发送请求。

首先我们访问jsp页面,然后在浏览器中右键、查看源代码,结果如下:

如何通过onlyoffice的令牌校验 java java令牌是什么意思_服务器_03

从源代码中用户可以得到几个关键信息。action="BWFToken",这个属性结合上当前jsp页面的url,用户可以得知服务器接收表单提交数据的url为“http://127.0.0.1:8090/BWF-JavaEE/BWFToken”。method="POST",从这个属性用户可以得知表单提交的方式为POST请求。和,这两个表单控件的源代码告诉了用户,该表单向服务器提交了两个参数信息,其key分别为username和userpass。

结合以上信息,用户可以轻松自己编写一个任意形式的小程序,绕开表单直接向服务器的Servlet发送请求。这种小程序可以是一个Applet,也可以是一个html页面,甚至是一个Ajax等等。

比如,小博老师为大家演示一下使用Ajax技术绕开表单直接向服务器的Servlet发送请求,核心代码如下:

$(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);
}
);
});

我们使用浏览器访问该页面,效果如下:

如何通过onlyoffice的令牌校验 java java令牌是什么意思_java 令牌解析_04