[理论知识]html
咱们在网站开发的过程当中,常常须要会使用到form表单,表单提供了丰富的客户端与服务器端交互的控件。可是在开发过程当中,咱们须要注意表单的各方面安全性问题,好比防止客户绕开表单向服务器发送请求(这是一个很危险的现象)。jquery
在咱们学习过的技术中,有不少技术都是为了确保表单的安全性,好比验证码技术(虽然它是一个对于普通用户很不友好的东西)。小程序
在本系列文章中,小博老师就为你们讲解表单安全性的另外一个技术——表单令牌(Token)。浏览器
[步骤解读一]无令牌表单安全
相信你们对于普通form表单与服务器的交互已经很是熟悉了,小博老师这里就不浪费篇幅多作介绍了,咱们新建一个jsp文件提供用户填写信息的表单,核心代码以下:服务器
<form action="BWFToken" method="POST">jsp
帐户名称:<input type="text" name="username"/><br/><br/>post
帐户密码:<input type="password" name="userpass"/><br/><br/>学习
<input type="submit" value="登 录"/>网站
</form>
而后咱们再建立一个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页面,效果以下:
填写帐户名称和帐户密码,提交给Servlet后,效果以下:
[步骤解读二]用户绕开表单
以上是一个最普通的表单和服务器交互的案例,这样的表单是存在必定风险的,用户彻底能够绕开表单直接向服务器发送请求。
首先咱们访问jsp页面,而后在浏览器中右键、查看源代码,结果以下:
从源代码中用户能够获得几个关键信息。action="BWFToken",这个属性结合上当前jsp页面的url,用户能够得知服务器接收表单提交数据的url为“http://127.0.0.1:8090/BWF-JavaEE/BWFToken”。method="POST",从这个属性用户能够得知表单提交的方式为POST请求。<input type="text" name="username"/>和<input type="password" name="userpass"/>,这两个表单控件的源代码告诉了用户,该表单向服务器提交了两个参数信息,其key分别为username和userpass。
结合以上信息,用户能够轻松本身编写一个任意形式的小程序,绕开表单直接向服务器的Servlet发送请求。这种小程序能够是一个Applet,也能够是一个html页面,甚至是一个Ajax等等。
好比,小博老师为你们演示一下使用Ajax技术绕开表单直接向服务器的Servlet发送请求,核心代码以下:
<body>
<script src="script/jquery-1.4.2.min.js"></script>
<script>
$(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);
}
);
});
</script>
</body>
咱们使用浏览器访问该页面,效果以下: