python使用requests庫(kù)提交multipart/form-data請(qǐng)求的方法詳解
前言
今天滲透測(cè)試的時(shí)候,發(fā)現(xiàn)一個(gè)接口可以越權(quán)遍歷出用戶的敏感信息,然后想編寫(xiě)python腳本將所有信息都給dump下來(lái)。當(dāng)我查看請(qǐng)求數(shù)據(jù)的時(shí)候,是如下這樣的。不同于之前的請(qǐng)求數(shù)據(jù)是json可以直接使用data然后封裝成字典就可以進(jìn)行發(fā)送請(qǐng)求
這里的content-type是 multipart/form-data
multipart/form-data
Multipart/form-data其實(shí)就是上傳文件的一種方式。我對(duì)它的翻譯是 “多部分表單數(shù)據(jù)” ;在生活中其實(shí)經(jīng)常用到,比如說(shuō),在寫(xiě)郵件時(shí),向郵件后添加附件,附件通常使用表單添加,也就是用multipart/form-data格式上傳到服務(wù)器。
http協(xié)議本身的原始方法其實(shí)并不支持multipart/form-data請(qǐng)求,它是由post方法來(lái)組合實(shí)現(xiàn)的
- multipart/form-data與post方法的不同之處(請(qǐng)求頭,請(qǐng)求體)
- multipart/form-data的請(qǐng)求頭必須包含一個(gè)特殊的頭信息:Content-Type,且其值也必須規(guī)定為multipart/form-data,同時(shí)還需要規(guī)定一個(gè)內(nèi)容分割符用于分割請(qǐng)求體中的多個(gè)post的內(nèi)容,如文件內(nèi)容和文本內(nèi)容自然需要分割開(kāi)來(lái),不然接收方就無(wú)法正常解析和還原這個(gè)文件了。
multipart/form-data的請(qǐng)求體也是一個(gè)字符串,不過(guò)和post的請(qǐng)求體不同的是它的構(gòu)造方式,post是簡(jiǎn)單的name=value值連接,而multipart/form-data則是添加了分隔符等內(nèi)容的構(gòu)造體,格式如下:
------WebKitFormBoundaryA0Srut8TBztAofvx Content-Disposition: form-data; name="grant_type" password ------WebKitFormBoundaryA0Srut8TBztAofvx
其中第一行是自定義的分割符,需要與請(qǐng)求頭中規(guī)定的分割符相同。
其實(shí)根據(jù)前言中的例子,可以很容易看出,這個(gè)請(qǐng)求體是多個(gè)類似的部分組成的:每一個(gè)部分都是以–加分隔符開(kāi)始的,然后是該部分內(nèi)容的描述信息,然后一個(gè)回車(chē),然后是描述信息的具體內(nèi)容;如果傳送的內(nèi)容是一個(gè)文件的話,那么還會(huì)包含文件名信息,以及文件內(nèi)容的類型。最后會(huì)以–分割符–結(jié)尾,表示請(qǐng)求體結(jié)束。
Python 發(fā)送 multipart/form-data
如下,我們要模擬post如下的數(shù)據(jù)包,那我們?nèi)绾伟l(fā)送post的數(shù)據(jù)攜帶以下紅色框中的參數(shù)了?
1. 重要代碼如下
data = {"id":(None,'899')} requests.post(xx,files=data)
2. headers中的Content-Type需要注釋掉,發(fā)送請(qǐng)求的時(shí)候會(huì)被自動(dòng)加上,否則會(huì)報(bào)錯(cuò)
編寫(xiě)的python requests請(qǐng)求腳本如下
運(yùn)行然后使用proxychains抓取流量如下,成功模擬的請(qǐng)求發(fā)送
再次提醒:Content-Type需要注釋掉!很重要?。?
補(bǔ)充知識(shí):multipart/form-data 參數(shù)轉(zhuǎn)碼
比如請(qǐng)求參數(shù)是:
--e0ed233c-3202-47c6-9c96-f9181e308 Content-Disposition: form-data; name="id" Content-Transfer-Encoding: binary Content-Type: application/json; charset=UTF-8 Content-Length: 13 234545878 --e0ed233c-3202-47c6-9c96-f9181e308 Content-Disposition: form-data; name="type" Content-Transfer-Encoding: binary Content-Type: application/json; charset=UTF-8 Content-Length: 1 1 --e0ed233c-3202-47c6-9c96-f9181e308--
也就是說(shuō),有2個(gè) key -> id 和 type
fields={ "id": '234545878', "type": '1' }
直接這樣發(fā)請(qǐng)求,會(huì)失敗。??
encode一下就能發(fā)請(qǐng)求了。??
from requests_toolbelt.multipart.encoder import MultipartEncoder multipart_data = MultipartEncoder( fields={ "id": '1653302392217', "read_duration_list": read_duration_list, "now": now, "type": '1' } ) header['Content-Type'] = multipart_data.content_type header['accept'] = 'application/json'
總結(jié)
到此這篇關(guān)于python使用requests庫(kù)提交multipart/form-data請(qǐng)求的文章就介紹到這了,更多相關(guān)python提交multipart/form-data請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
把JSON數(shù)據(jù)格式轉(zhuǎn)換為Python的類對(duì)象方法詳解(兩種方法)
本文通過(guò)兩種方法給大家介紹了把JSON數(shù)據(jù)格式轉(zhuǎn)換為Python的類對(duì)象,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06python使用redis模塊來(lái)跟redis實(shí)現(xiàn)交互
這篇文章主要介紹了python使用redis模塊來(lái)跟redis實(shí)現(xiàn)交互,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Python中實(shí)現(xiàn)單例模式的n種方式和原理
這篇文章主要介紹了Python中實(shí)現(xiàn)單例模式的n種方式和原理,需要的朋友可以參考下2018-11-11python使用pika庫(kù)調(diào)用rabbitmq參數(shù)使用詳情
這篇文章主要介紹了python使用pika庫(kù)調(diào)用rabbitmq參數(shù)使用詳情,文章通過(guò)展開(kāi)文章主題分享了三種方式,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08用pandas劃分?jǐn)?shù)據(jù)集實(shí)現(xiàn)訓(xùn)練集和測(cè)試集
這篇文章主要介紹了用pandas劃分?jǐn)?shù)據(jù)集實(shí)現(xiàn)訓(xùn)練集和測(cè)試集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07