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

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

1、 简单说明

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

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

2、 观点:

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

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

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

4、 通过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
正是我们刚才访问的链接,非常好。测试很成功。 赞赞赞。

5、 被攻击

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。