程序员人生 网站导航

看好你的门-客户端传数据(3)-不安全的http信息头

栏目:互联网时间:2015-04-08 08:49:56

首先需要声明,本文纯属1个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考,请勿用与非法用处。

1、 简单说明

在互联网中,大量的数据通过URL参数的方式进行传递,大部份的数据,是没有通过加密进行传输。在我所了解到的情况,大部份的数据是通过明码进行…
固然,现在大家都知道,URL参数,安全性不是特别高,因而http信息头(包括referer等属性)进入了大家的视野。

Referer用来表明,阅读器向 WEB 服务器表明自己来自哪里。

2、 观点:

不知道从甚么时候起,相比起直接的URL参数,很多人都认为HTTP信息头有更加强悍的防攥改的能力。 很多开发者信任通过cookie和http信息头提交的数值,而对URL参数进行严格控制。
这类认识不那末全面,由于对任何使用数据拦截代理服务器的人来讲,所有的数据都是暴露在外面的。
根据w3.org标准,http信息头完全是可选的。也就是,Referer属性也是可以变化的。

3、 HTTP信息头的常见利用场景

比如有1个修改用户密码的页面,这个页面必须要管理员操作。
我们想固然的认为,如果我们可以判断这个页面来自管理员,那末就是可信任的,是可以操作的。
为了安全起见,我们把这个验证的信息不放在URL中,我们放在HTTP信息里,看起来很高大上吧。

4、 通过http信息头认证信息的简单源代码

http_accept.jsp

<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF⑻"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>看好你的门-阿饭同学</title> </head> <body> 如果不是来自超级管理员,那末我没法被访问(超级管理员是来自1个叫做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>

运行1下:http://127.0.0.1:8080/webStudy/http_accept.jsp
结果:

如果不是来自超级管理员,那末我没法被访问(超级管理员是来自1个叫做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属性,好像看起来很不错。

我另外写1个简单代码验证:
http_visit.jsp

<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF⑻"%> <!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
显示:

如果不是来自超级管理员,那末我没法被访问(超级管理员是来自1个叫做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
正是我们刚才访问的链接,非常好。测试很成功。 赞赞赞。

5、 被攻击

http信息头虽然没有显示在屏幕上,看起来用户也不能去修改。 但是客户真个1切终究操作都是用户控制,直接通过拦截代理服务器对数据进行修改就能够访问。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐