HTTP另类的POST头数据 RFC1867协议格式简析

Posted zzfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP另类的POST头数据 RFC1867协议格式简析相关的知识,希望对你有一定的参考价值。

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协议格式简析的主要内容,如果未能解决你的问题,请参考以下文章

如何实现同时上传多个文件

RFC1867 HTTP file upload

HTTP协议数据结构分析

http中上传文件的原理

HTTP协议头字段

鲜为人知的HTTP协议头字段详解大全