首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考,请勿用与非法用途。
在互联网中,大量的数据通过URL参数的方式进行传递,大部分的数据,是没有通过加密进行传输。在我所了解到的情况,大部分的数据是通过明码进行…
当然,现在大家都知道,URL参数,安全性不是特别高,于是http信息头(包含referer等属性)进入了大家的视野。
Referer用来表明,浏览器向 WEB 服务器表明自己来自哪里。
不知道从什么时候起,相比起直接的URL参数,很多人都认为HTTP信息头有更加强悍的防攥改的能力。 很多开发者信任通过cookie和http信息头提交的数值,而对URL参数进行严格控制。
这种认识不那么全面,因为对任何使用数据拦截代理服务器的人来说,所有的数据都是暴露在外面的。
根据w3.org标准,http信息头完全是可选的。也就是,Referer属性也是可以变化的。
比如有一个修改用户密码的页面,这个页面必须要管理员操作。
我们想当然的认为,如果我们可以判断这个页面来自管理员,那么就是可信任的,是可以操作的。
为了安全起见,我们把这个验证的信息不放在URL中,我们放在HTTP信息里,看起来很高大上吧。
http_accept.jsp
<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>看好你的门-阿饭同学</title>
</head>
<body>
如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer) <br>
地址:<%=(String)request.getRemoteAddr()%> <br>
编码:<%=(String)request.getCharacterEncoding() %> <br>
<%
//response.setHeader("referer","admin.jsp");
Enumeration<String> reqHeadInfos = request.getHeaderNames();
int i = 0;
while (reqHeadInfos.hasMoreElements()) {
String headName = (String) reqHeadInfos.nextElement();
String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
out.write(headName + ":" + headValue);
out.write("<br/>");
if (headName.equals("referer") && (headValue.equals("admin.jsp"))){
i = 1; // 登陆成功
}
}
out.write("<br/>");
out.write(" <h3 style=‘color:red;‘>");
if ( i == 1){
out.write("恭喜管理员,访问成功");
}else{
out.write("不是管理员,请从管理员页面进入");
}
out.write("</h3>");
%> <br>
</body>
</html>
运行一下:http://127.0.0.1:8080/webStudy/http_accept.jsp
结果:
如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer)
地址:127.0.0.1
编码:null
host:127.0.0.1:8080
connection:keep-alive
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=2B927E8B22425D29CB623BD35970CF08
不是管理员,请从管理员页面进入
因为我是直接访问链接的,因此没有referer属性,好像看起来很不错。
我另外写一个简单代码验证:
http_visit.jsp
<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>看好你的门-阿饭同学</title>
</head>
<body>
我不是管理员,我只是来搞山寨的 <br>
<a href="http_accept.jsp"> 点我访问http_accept.jsp</a>
</body>
</html>
访问:http://127.0.0.1:8080/webStudy/http_visit.jsp
显示:
如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer)
地址:127.0.0.1
编码:null
host:127.0.0.1:8080
connection:keep-alive
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=703D6301DAC606173E0118D0DD35BEA1
不是管理员,请从管理员页面进入。
其中,referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
正是我们刚才访问的链接,非常好。测试很成功。 赞赞赞。
http信息头虽然没有显示在屏幕上,看起来用户也不能去修改。 但是客户端的一切最终操作都是用户控制,直接通过拦截代理服务器对数据进行修改就可以访问。
原文地址:http://blog.csdn.net/ffm83/article/details/44095025