【HTTP】另类的POST头数据 RFC1867协议格式简析
苏南
昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(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的实体看起来将是类似下面的样子:
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了
写在最后的,在这个实战post过程中,我使用了wsockexport这个软件进行抓包操作,使得整个过程简化了很多,在这里向作者表示敬意,(btw:rising对其中的hook.dll似乎不怎么喜欢,大家用的时候,请关闭杀毒软件,或者加入白名单)。相关文章:http://blog.sina.com.cn/u/4c4a58ca010009bk (苏南)
本文来自苏南的博客, 转载请注明网址:http://newsn.net, 谢谢!
我的淘宝小店:http://68zz.com
我的Sina圈子:http://q.blog.sina.com.cn/pctalk
