`

客户端HTTP消息码流分析

    博客分类:
  • Java
阅读更多

在开发Web程序时,我们向Web服务发送请求是最常见的事,如果了解向服务器提交的HTTP码流,对有些问题我们就会有很好的把握,比如HTTP信息结构、乱码产生、表单参数以及URL绑定参数的传递提交机制,对我们提交的数据心中有数。下面我们就来看看通过表单与URL两种提交请求方式时各自的HTTP码流究竟如何?先来了解了解HTTP消息格式。

HTTP消息格式

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

 

请求报文

 

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

 

 

 

 

 


 
1、请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。


HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。


GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。


POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

2、请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

3、空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态


4、请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

 

 

 

 

 

 

了解了HTTP消息格式后,先我们要模拟服务器,让客户端往我们模拟服务器发送,这样我们就可以截获码流。下面是服务器模拟程序:

客户端HTTP码流端截取程序

 

import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { public static void main(String[] args) { try { ServerSocket sSocket = new ServerSocket(8088); Socket socket = sSocket.accept(); InputStream is = socket.getInputStream(); //String encode = "GB2312"; String encode = "UTF-8"; putStream(is, encode); } catch (IOException e) { e.printStackTrace(); } } public static void putStream(InputStream is, String encode) throws IOException, UnsupportedEncodingException { byte[] content = new byte[1024]; int readCount = is.read(content); OutputStreamWriter bos = new OutputStreamWriter(System.out); while (readCount != 0) { bos.write(new String(content, 0, readCount, encode)); bos.flush(); readCount = is.read(content); } is.close(); } }


 

POST方式提交表单并且URL后面绑定参数

JSP页面如下:

 

<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&amp;*()_+{}|:\&quot; &lt;&gt;?`-=[]\\;',./"> <br> <input type="file" name="fileParam" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; //form1.action = "gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>


 页面截图:


 

提交后地址栏如下:

http://localhost:8080/HttpStream/gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F

HTTP消息码流:

POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer:
http://localhost:8080/HttpStream/gb2312.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8088
Content-Length: 132
Connection: Keep-Alive
Cache-Control: no-cache

 

textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt

从上面码流分析可知:

  • URL后绑定的参数会显示在HTTP消息头中。
  • 文件类型没有传到服务器,因为表单未设置enctype="multipart/form-data",但文件名却传过来了。
  • 提交请求为编码方式为GB2312的页面表单时,参数qryParam1与参数qryParam2都是UTF-8的编码格式,而不是以GBP312方式编码的,因此encodeURIComponent()函数是固定以UTF-8编码的,它不会受到当前浏览器的编码影响。
  • 经过encodeURIComponent()函数编码后的附加参数内容会以%xx形式串显示在地址栏中。
  • POST方式的HTTP头与HTTP体是用一个回车换行来分隔的。
  • POST方式提交表单,如果URL后面还附还参数,也会提交到服务器,且放在HTTP头部,其他表单输入元素会放在HTTP体里传送。
  • POST方式提交表单时,在头部会有 Content-Type: application/x-www-form-urlencoded 这样一个头信息,而GET方式提交的表单是不会有该头信息的,也不会有HTTP请求体。
  • POST方式提交时,表单里的元素值会先用浏览器的编码(这里使用的是GB2312编码)方式时行编码(a-z A-Z 0-9 +@*_-. 不进行编码),然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。

GET方式提交表单

JSP页面如下:

与上面一样,只是表单提交方式改为 get。

页面截图:

与上面一样。

提交后地址栏如下:

http://localhost:8088/gb2312rs.jsp?textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt

HTTP消息码流:

GET /gb2312rs.jsp?textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParamhttp://localhost:8080/HttpStream/gb2312.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
Accept-Encoding: gzip, deflate
Host: localhost:8088
Connection: Keep-Alive
=file1.txt HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer:

 

从上面码流分析可知:

  • GET方式时,表单里的参数会先以浏览器编码成%XX形式后附加到URL后,并显示在地址栏中。
  • GET方式提交表单时,如果表单URL附加参数,这些参数是不能传递到服务器端去的,相反表单里的元素会附加在URL后面并传送到服务器,所以当提交表单时,如果表单URL还附加参数,则一定要以POST方式提交,否则是不能传递到服务器。
  • GET方式提交的请求HTTP头里没有  Content-Type: application/x-www-form-urlencoded  头信息。
  • GET提交时,表单里的元素值会先用浏览器的编码方式时行编码,然后把编码转换成%xx形式的串。
  • 文件上传时HTTP码流

    JSP页面如下:

    <%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post" enctype="multipart/form-data"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&amp;*()_+{}|:\&quot; &lt;&gt;?`-=[]\\;',./"> <br> <input type="file" name="fileParam1" size="50 px" value=""> <br> <input type="file" name="fileParam2" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>

    
    

      页面运行图:


     HTTP消息码流:

     

    POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1
    Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Referer:
    http://localhost:8080/HttpStream/gb2312.jsp
    Accept-Language: zh-CN
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
    Content-Type: multipart/form-data; boundary=---------------------------7d9165750396
    Accept-Encoding: gzip, deflate
    Host: localhost:8088
    Content-Length: 595
    Connection: Keep-Alive
    Cache-Control: no-cache

     

    -----------------------------7d9165750396
    Content-Disposition: form-data; name="textParam1"

     

    中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
    -----------------------------7d9165750396
    Content-Disposition: form-data; name="fileParam1"; filename="file1.txt"
    Content-Type: text/plain

     

    这是第一个测试文件的内容:
    1111111111111
    aaaaaaaaaaaaa
    -----------------------------7d9165750396
    Content-Disposition: form-data; name="fileParam2"; filename="file2.txt"
    Content-Type: text/plain

     

    这是第二个测试文件的内容:
    中a
    ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
    -----------------------------7d9165750396--

    码流分析:

    • 文件上传时表单要设置 enctype="multipart/form-data" 属性。
    • 上传时文件与参数一起放置在HTTP体里传送,并且参数不组以%XX形式传送,而是经过浏览器编码后直接传送到服务器,但文件内容就不同了,浏览器读取要上传文件时,不会使用任何编码来读取,而是原样读取(即在上文件时浏览器是以字节流形式读取文件的,而不是以字符形式来读取的,否则会涉及到编码问题)后发往服务器(试想下,如果浏览读取上传文件时还经过了浏览器编码,那我们上传的非字符性文件会坏掉)。
    • 消息头含有Content-Length属性,它表示消息体的总体长度。

     

    附件为码流文件

     

    参考:

    http://blog.csdn.net/yc0188/archive/2009/10/29/4741871.aspx

    • 大小: 1.9 KB
    • 大小: 2.4 KB
    • 大小: 31.5 KB
    分享到:
    评论

    相关推荐

      windows版本密码管理系统客户端,已调试兼容win7、win8、win10,其他win系统版本未进行测试.zip

      供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同运作。 企业资源计划系统(ERP):对企业内部财务、生产、采购、库存、销售等各项资源进行全面集成...

      octopus:WebAssembly模块(wasm)和区块链智能合约(BTCETHNEOEOS)的安全性分析工具

      产品特点资源管理器:章鱼JSON-RPC客户端实现与区块链平台进行通信反汇编程序:章鱼可以将字节码转换为汇编表示形式控制流分析:章鱼可以生成控制流图(CFG) 呼叫流分析:章鱼可以生成一个呼叫流图(功能级别) IR...

      《数据库课程设计》_大作业_银行储蓄业务管理系统.docx

      本次课程设计的题目是银行储蓄业务管理系统,业务流分析: 本软件实现银行的活期储蓄存款业务,整套软件由客户端程序和服务端程序构成,,客户端运行在面向个人业务的银行柜台的电脑上,银行职员输入相关信息并通过网络...

      《数据库课程设计》_大作业_银行储蓄业务管理系统 作品二.docx

      本次课程设计的题目是银行储蓄业务管理系统,业务流分析: 本软件实现银行的活期储蓄存款业务,整套软件由客户端程序和服务端程序构成,,客户端运行在面向个人业务的银行柜台的电脑上,银行职员输入相关信息并通过网络...

      android即时通讯软件毕业设计论文

      2.1.1 可行性分析 - 9 - 2.1.2系统功能需求 - 9 - 2.1.3 系统性能需求 - 10 - 2.1.4 系统运行需求 - 10 - 2.2.1 顶层数据流图 - 10 - 2.2.2 一层数据流图 - 11 - 2.2.3 二层数据流图 - 11 - 3 概要设计 - 12 - 3.1...

      基于symb1an智能手机的视频监控

      客户端软件的MPEG一4视频解码实现进行了研究,分析了MPEG一4码流并给出了解 码器流程图,实现了Symbian平台上MPEG一4视频解码。对解码器的优化方法进 行了讨论,对比了两种IDCT算法,对解码器IDCT过程进行优化,并在...

      phpdesigner8下载地址+注册码

       由于可以搭配使用的相关免费资源相当的多,PHP 的网页设计越来越多人在学习了,MPS PHP DESIGNER 是针对 PHP 网页的编写所设计的程序,它内建一系列的指令码、PHP4 原始码数据库、语法高亮度显示功能、FTP 客户端....

      驰骋工作流引擎源码

      基本功能: 图形化流程设计/智能表单web定义免程序开发/级联下拉框/流程轨迹/单据自定义打印/邮件短信工作到达通知/自动任务分配/支持sdk模式开发/简洁集成/消息侦听/丰富事件接口/报表定义/工作量分析/绩效考核/手机...

      教务辅助管理系统-数据库课程设计报告.doc

      目 录 1、开发背景 3 2、系统描述 3 3、数据分析 4 3.1 数据流图 4 3.2 数据字典 5 4、概念模型设计 10 5、 逻辑模型设计及优化 12 6、课程设计心得体会 14 1、开发背景 随着学校的发展,越来越多的学生来学校求学,...

      phpDesigner_8.1.0.10 含注册码

      由于可以搭配使用的相关免费资源相当的多,PHP 的网页设计越来越多人在学习了,MPS PHP DESIGNER 是针对 PHP 网页的编写所设计的程序,它内建一系列的指令码、PHP4 原始码数据库、语法高亮度显示功能、FTP 客户端.....

      银行存取款系统数据库设计.docx

      需求分析 (1)用户的基本需求: 用户对银行存取款客户端的要求不高,他们需要的是自己通过直接操作来获得自己所需要的服务,如存款、取款、转账、查询、修改密码、缴费等。每一个功能,用户都可以根据系统的提示一步...

      基于FPGA的JPEG实时图像的编解码系统

      其中,服务器端实时采集报像头传送的动态图像,进行IPEG编码,选过网络传送码液到客户端:客户端接收码流,经过PEG解码,怏复出原始图像送vGA显示,设计结果完全达到了实时性的要求.   本文从系统实现的...

      java开源包8

      JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

      JAVA课程设计(1).doc

      " " (4)通过数据输入输出流与客户端进行数据读写,完成双向通信。 " " (5)当客户端断开连接时,关闭各个流对象,结束通信。 " "该部分主要由Server、ServerThread和GetConnection3个类组成。 " "b)客户端 " "(1)...

      30天学通C#项目案例开发源码(上) 孔琳俊

      3.4.4 使用PrismNetworkStream类封装网络流 120 3.4.5 使用PrismServerImplementation组件管理用户信息 123 3.4.6 类库中的实体类 128 3.4.7 用户信息对话框组件的实现 129 3.4.8 服务器统计信息对话框组件的...

      Acunetix Web Vulnerability Scanner( 简称AwVS )是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测

      a)、自动的客户端脚本分析器,允许对Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如HTTP Editor 和HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试...

      交互式经纪人python-api:适用于Interactive Broker提供的不同API的python客户端库,包括Trader Workstation API,Client Portal Web API和Client Portal Streaming Web API

      请单击以下链接: Trade Workstation API,请参考客户端门户API,请参考第三方API,请参考API中有什么认证方式帐户端点市场数据端点贸易端点投资组合端点扫描仪端点投资组合分析端点网络流媒体设置要求使用此API必须...

      论文研究-一种新的双向认证的一次性口令系统TAOTP.pdf

      分析了现有的几种一次性口令系统,指出服务端的不安全性、对S/KEY的小数攻击等问题,在此基础上提出并实现了双向认证一次性口令协议TAOTP(Twoway Authenticate One Time Password),采用单向函数,通过客户端和...

    Global site tag (gtag.js) - Google Analytics