http://blog.csdn.net/ai2000ai/article/details/52161979

昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错,无法检测到数据来源云云,但是我确实提交了http_referer了啊,怎么会出现这个情况呢?问了下haohappy,他给了个pear的类,http/client,才发现,我研究了几天的东东,原来有个现成的可以用,“使用pear站在巨人的肩膀上”,这个果然没有错。过些天组装一个client试试看。
 
又扯远了,书归正传,说研究一下一个另类的post头,为什么说另类呢,因为一般的post头的
Content-Type: application/x-www-form-urlencoded
而他的是
Content-Type: multipart/form-data; boundary=-------7d71f4234700b8
 
那么两者的区别又在那里呢?
 
1、做过表单html的coder都知道,在需要有上传文件操作的时候,表单的类型必须是enctype="multipart/form-data",那么这里也就这个原因,究其根源,可以追溯到RFC1867协议,这个协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。
 
2、后者增加了boundary,所谓的boundary其实就是分割线,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。
 
3、对HTTP实体的变更

因为RFC1867增加了文件上传的功能,而上传文件内容自然也会被加入到HTTP的实体中。现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割,HTTP的实体看起来将是类似下面的样子:

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="formhash"

59329e15
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="isblog"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="fid"

104
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="subject"

test
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="iconid"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="usesig"

1
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="message"

test
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachperm[]"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachdesc[]"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attach[]"; filename=""
Content-Type: application/octet-stream

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachperm[]"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachdesc[]"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attach[]"; filename=""
Content-Type: application/octet-stream

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="wysiwyg"

1
-----------------------------7d71f4234700b8--

很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。

4、那么同样,这种格式也是需要提供Content-Length属性的,那么和简单的post数据头相比较,就可以发现,变化的地方有:

......

Content-Type:

......
Content-Length:

......

数据体 goes here~

注意到这几个地方的变化后,就可以像往常一样post了

【HTTP】另类的POST头数据 RFC1867协议格式简析的更多相关文章

  1. IPsec协议簇简析

    简介 IPsec协议簇是应用在网络层上的,来保护IP数据报的一组网络传输协议的集合.它是IETF(Internet Engineering Task Force)制定的一系列协议,它为IP数据报提供了 ...

  2. BA-协议-BACnet 协议优势简析

    BACnet - Building Automation and Control Network 的简称,为楼宇自控网络制定 的网络和通讯协议 .由美国暖通空调工程师协会主导制定的开放的楼宇自控通讯标 ...

  3. Android Http POST文件上传之-----RFC1867协议

    RFC1867协议介绍            RFC1867协议主要是在HTTP协议的基础上为INPUT标签添加了file属性.同一时候限定了Form的method必须为POST,ENCTYPE必须为 ...

  4. 示例:Netty 处理 TCP数据分包协议

    一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方:                                   ...

  5. WebSocket数据包协议详解

    其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分. ...

  6. 分布式环境中,模块数据交互协议分析 (百度brpc)

    1. 背景 之前听到同事说,要为自己的模块考虑写个数据协议.今天有空想了一下.写出来,方便后续使用. 开源代码brpc中可以支持多种协议,nshead.redis.mongo等20多种协议. 2. 什 ...

  7. 006-UDP用户数据报文协议

    一.概述 用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议,正式规范为RFC 768. 在TCP/IP模型中 ...

  8. iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍

    网络编程:HTTP协议.XML数据协议.JSON数据协议: HTTP: 1.HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式. 说明:同步和异步请求方式在创建链接对象和 ...

  9. JSONP -- 跨域数据交互协议

    一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式 ...

随机推荐

  1. 25个led灯新玩法

    Microbit板子的25个led灯,是5X5的阵列,led(lights emitting diodes)中文叫发光二极管,有单向导电性,还发光,有各种颜色的,红,蓝,黄等等.mPython可以让你 ...

  2. js推箱子

    <head> <meta charset="utf-8" /> <title></title> <script> //创 ...

  3. JSR223 PostProcessor VS BeanShell PostProcessor in JMeter

    I would recommend using JSR223 PostProcessor About performance: In JMeter's official user manual, Ab ...

  4. c/c++封装成python包

    参考网址:https://blog.csdn.net/tiankongtiankong01/article/details/80420033 SWIG (Simplified Wrapper and ...

  5. 命令源码文件——Golang

    源码文件又分为三种,即:命令源码文件.库源码文件和测试源码文件,它们都有着不同的用途和编写规则. 命令源码文件:1.独立程序的入口2.属于main包,包含无参数和无结果的main函数3.main函数执 ...

  6. NET MVC 上传文件

    1.HTML @using (Html.BeginForm("UploadFile", "Student", FormMethod.Post, new { en ...

  7. VS 发布MVC网站缺少视图

    mvc项目发布之后会有一些视图文件缺少,不包含在发布文件中,虽然可以直接从项目文件中直接拷贝过来,但还是想知道是什么原因,发布文件好像没有找到哪里有设置这个的地方 把生成操作:无-改成内容即可 原文

  8. Reactive MySQL Client

    Reactive MySQL Client是MySQL的客户端,具有直观的API,侧重于可伸缩性和低开销. 特征 事件驱动 轻量级 内置连接池 准备好的查询缓存 游标支持 行流 RxJava 1和Rx ...

  9. C# 查看系统进程

    //使用前需要引用 using System.Diagnostics; var processList = Process.GetProcesses().ToList();

  10. mybatis关联映射一对多

    实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...