python curllib3实现http multipart改变boundary后Type和Disposition的顺序

博客探讨了HTTP RFC7578协议中关于文件上传的规范,指出Content-Type和Content-Disposition顺序的灵活性。作者通过Python的urllib3库模拟POST请求,尝试改变字段顺序,并通过抓包工具验证了请求的通用性。实验结果显示,调整顺序后的请求仍能成功发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http rfc7578协议中并未规定boundary后Type和Disposition的顺序,通过抓包发现大部分系统都是有以下顺序传输文件

C:\fakepath\web_up.dat^M
------WebKitFormBoundaryZ0LELBsfCGAkpKSZ^M
Content-Disposition: form-data; name="filename"; filename="web_up.dat"^M
Content-Type: application/octet-stream^M

那么我想将type更换到前面去按理说是可以的,并且这个请求也应该是通用的。

于是查找python curllib3底层库,在fields.py中找到了sort_keys,于是改变它的顺序

于是用python 程序模拟了一下,

import urllib3
flag = 1

#urllib3
def connect():
        with open('python_up.dat',encoding='utf-8') as fp:
            file_data = fp.read()
        http = urllib3.PoolManager()
        if flag == 0:
            r = http.request('GET',
                             'http://xxxxxxxxx/check_auth.jsp?_ajax=1&_username=adm&_passwd=123456',
                              headers={
                                  '_ajax' : '1',
                                  '_username' : 'adm',
                                  '_passwd' : '123456',
                                  }
                             )
        else:
            r = http.request('POST','http://xxxxxxxxx:80/upload.cgi',
                             headers={'Content-Type': "application/octet-stream; boundary=----------------------------246805051776340189008411",
                                      'Cookie' : 'web_session=1aa666c1',
                                      'Content-Disposition': 'form-data',                 

                                      },
                             multipart_boundary =  'boundary=----------------------------246805051776340189008411',                        
                             fields = {'filefield':('python_up.dat',file_data,
                                                    'application/octet-stream'),}
                             )
        print (r.status)
        print (r.headers)
        print (r.data)
connect()

通过抓包,完成结果

 

小小记录一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值