防止表单在网站外部提交_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 防止表单在网站外部提交

防止表单在网站外部提交

 2014/7/9 12:46:49  乐小易  程序员俱乐部  我要评论(0)
  • 摘要:原理很简单,比较两个主机地址就OK了。下面的最详细的具体做法。最近自己在学习JavaWeb入门。遇到了一个最简单的却又完全忽略的安全BUG,即我们目前的网页涉及到表单提交,所提交的目标地址是可以通过查看网页源代码看到的,这样子就可以实现在本地运行静态网页并向服务器提交数据的功能。也就是说,任何人都可以利用网页从外部登录网站,从而给网站留下严重过的安全隐患。为此,我们就需要解决这样一个问题:防止表单在网站外部提交。首先,我们来写一个最简单的表单提交网页:<
  • 标签:网站 表单
   原理很简单,比较两个主机地址就OK了。下面的最详细的具体做法。
   最近自己在学习JavaWeb入门。遇到了一个最简单的却又完全忽略的安全BUG,即我们目前的网页涉及到表单提交,所提交的目标地址是可以通过查看网页源代码看到的,这样子就可以实现在本地运行静态网页并向服务器提交数据的功能。也就是说,任何人都可以利用网页从外部登录网站,从而给网站留下严重过的安全隐患。为此,我们就需要解决这样一个问题:防止表单在网站外部提交。
   首先,我们来写一个最简单的表单提交网页:
 
class="java" name="code"><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>普通的提交表单</title>
</head>
<body>
<center><form action="quanan.jsp" method="post" id="form">
<ul>
   <li>用户名:<input type="text" name="name"  value="admir" size="29"></li>
   <li>密&nbsp;码:<input type="text" name="psw" value="admir" size="29"></li>
   <li><input type="submit" value="注册"><input type="reset" value="重置"></li>
</ul>
</form>
</center>
</body>
</html>

  这里我们表单的提交目标地址是:
action="quanan.jsp"
显然这个就是我们平常的写法。
  现在我们用非法的手段来访问这个地址。
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>非法的提交表单</title>
</head>
<body>
<center>
<form  action="http://192.168.191.1:8888/FirstProject/quanan.jsp" method="post" id="form">
<ul>
   <li>用户名:<input type="text" name="name" size="29"></li>
   <li>密&nbsp;码:<input type="text" name="psw" size="29"></li>
   <li><input type="submit" value="注册"><input type="reset" value="重置"></li>
</ul>
</form>
</center>
</body>
</html>

  观察二者就是提交的目标地址不同:
action="http://192.168.191.1:8888/FirstProject/quanan.jsp"

(192.168.191.1为本机联网所在路由器的IP,通过命令行输入ipconfig查询得到)
这样我们就模拟出在外部提交表单的效果了。
    现在我们需要考虑一下这个quanan.jsp的编写了。
    其实很简单,我们只要用request.getHeader(“referrer”)来获取得到目标地址,然后通过URL urlOne=new URL(String url)的方法得到目标地址的URL,在通过urlOne.getHost();来得到其主机。
    同样的道理,我们只需要通过request.getRequestURL().toString()方法获得当前网页的IE地址,然后在获得URL,最后是主机地址。
    最后比较两个主机地址是否相同,就可以得出结论了~
   
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.net.URL"%>
<%@page import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>防止表单在本机地址上被提交</title>
</head>

<%
   //获取页面的请求地址
    String strOne = request.getHeader("referer");
   //用来存储请求页面的服务器主机
   String pathOne = "";
   //当请求页面的地址不为空时,获取主机
   if(strOne != null){
	   URL urlOne = new URL(strOne);
	   pathOne = urlOne.getHost();
%><center><b><pre>页面请求的地址和其主机:<% out.println(strOne);%><% out.println(pathOne);%></pre></b></center><% 
   }
   
   //获取当前页面的请求地址
   String strTwo = request.getRequestURL().toString();
   //用来存储当前页面的服务器主机
   String pathTwo = "";
   if(strTwo != null){
	   URL urlTwo = new URL(strTwo);
	   pathTwo = urlTwo.getHost();
%><center><b><pre>当前页面的服务器主机:<% out.println(strTwo);%><% out.println(pathTwo);%></pre></b></center><%    

   } 
%>
	   
<body>
	  	<%
			if (!pathOne.equals(pathTwo)) { //判断当前页面的主机与服务器的主机是否相同
						%> <center><b>禁止网站外部提交表单!!! </b></center><%
					} 
			else {
						String name = request.getParameter("name");
						String pass = request.getParameter("psw");
						out.println("<center><b>");
						out.println("用户名:" + name);
						out.println("<br>");
						out.println("密 码:" + pass);
						out.println("</b></center>");
					}
				%>   
</body>
</html>

     查看输出结果就能比较分析了:我采用的是tomcat部署运行的,所以提交的目的地址的主机地址就为本机地址和我所连的路由器的主机地址当然不同,所以。。。

     总共就三个页面:anquan.jsp,quanan.jsp,anquanTrue.jsp!代码都经过测试运行,初学者可以轻松尝试!(PS:有对JavaWeb感兴趣的求联系,一起交流学习QQ 651157519)
发表评论
用户名: 匿名