Python Requests庫對 URL 編碼問題

一亿遂、問題

在編寫跨站腳本漏洞輔助驗證腳本時遇到一個問題波岛,當使用 Requests 模塊發(fā)起請求材彪,默認會對 URL 進行一次編碼冠息,比如下面的代碼:

proxy = {"http": "http://127.0.0.1:8080"}
response = requests.get(res, proxies=proxy).text

使用 Burp Suite 抓包可以看到請求 URL 被 URL 編碼了一次:


二、原因

request.get 是通過構造 session 模塊中的Session類荠瘪,并調用其request方法完成請求夯巷。Session類的request方法先根據(jù)傳入的參數(shù)(如URL等)構造一個Request類,并調用self.prepare_request方法預準備哀墓,最后調用self.send發(fā)送最終的請求趁餐。
URL的編碼過程便在self.prepare_request方法中:

# session.py
def prepare_request(self, request):
    # 此部分代碼已忽略
    p = PreparedRequest()
    p.prepare(method=request.method.upper(), url=request.url, files=request.files,
        data=request.data, json=request.json,
        headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
        params=merge_setting(request.params, self.params), auth=merge_setting(auth, self.auth),
        cookies=merged_cookies,hooks=merge_hooks(request.hooks, self.hooks),
    )
    return p

# model.py
class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
    def prepare(self, method=None, url=None, headers=None, files=None,
        data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
        """Prepares the entire request with the given parameters."""
        self.prepare_method(method)
        self.prepare_url(url, params)
        self.prepare_headers(headers)
        self.prepare_cookies(cookies)
        self.prepare_body(data, files, json)
        self.prepare_auth(auth, url)
        self.prepare_hooks(hooks)

    def prepare_url(self, url, params):
        # 這里requests庫做了很多努力
        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
        self.url = url

最終我們傳進去的URL就被prepare_url函數(shù)進行了字符串編碼替換,回到Session類篮绰,調用resp = self.send(prep, **send_kwargs)發(fā)送請求后雷,prep即是上述PreparedRequest對象。

三吠各、解決方法

由于URL在PreparedRequest類中轉碼后傳到Session類的send方法中發(fā)送最終的請求臀突,只要寫一個類繼承Session并重寫send方法,在里面進行反編碼贾漏,將PreparedRequest對象的url屬性值改了候学。代碼如下:

#python2
import urllib
import requests

class NoQuoteSession(requests.Session):
    def send(self, prep, **send_kwargs):
        table = {
            urllib.quote('{'): '{',
            urllib.quote('}'): '}',
            urllib.quote(':'): ':',
            urllib.quote(','): ',',
            urllib.quote('<'): '<',
            urllib.quote('>'): '>',
        }
        for old, new in table.items():
            prep.url = prep.url.replace(old, new)
        return super(NoQuoteSeesion, self).send(prep, **send_kwargs)

s = NoQuoteSeesion()
res = s.get(url)

python3 中urllib.quote()變?yōu)?urllib.parse.quote():

#python3
class NoQuoteSession(requests.Session):
    def send(self, prep, **send_kwargs):
        table = {
            urllib.parse.quote('{'): '{',
            urllib.parse.quote('}'): '}',
            urllib.parse.quote(':'): ':',
            urllib.parse.quote(','): ',',
            urllib.parse.quote('<'): '<',
            urllib.parse.quote('>'): '>',
        }
        for old, new in table.items():
            prep.url = prep.url.replace(old, new)
        return super().send(prep, **send_kwargs)

2019 10 17 更新
python 3 中此方法沒用,解碼之后再發(fā)送請求之前纵散,url.py 中的 url()函數(shù)還會 urlencode梳码,所以發(fā)送的請求還是會編碼。
解決方法是使用 urllib 來發(fā)送請求:

 with request.urlopen(url) as response:
   data = response.read()
   return data.decode('utf-8')
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末伍掀,一起剝皮案震驚了整個濱河市掰茶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硕盹,老刑警劉巖符匾,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘩例,居然都是意外死亡啊胶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門垛贤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焰坪,“玉大人,你說我怎么就攤上這事聘惦∧呈危” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵善绎,是天一觀的道長黔漂。 經常有香客問我,道長禀酱,這世上最難降的妖魔是什么炬守? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剂跟,結果婚禮上减途,老公的妹妹穿的比我還像新娘。我一直安慰自己曹洽,他們只是感情好鳍置,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著送淆,像睡著了一般税产。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偷崩,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天辟拷,我揣著相機與錄音,去河邊找鬼环凿。 笑死梧兼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的智听。 我是一名探鬼主播羽杰,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼到推!你這毒婦竟也來了考赛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤莉测,失蹤者是張志新(化名)和其女友劉穎颜骤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捣卤,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡忍抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年八孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠项。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡干跛,死狀恐怖,靈堂內的尸體忽然破棺而出祟绊,到底是詐尸還是另有隱情楼入,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布牧抽,位于F島的核電站嘉熊,受9級特大地震影響,放射性物質發(fā)生泄漏扬舒。R本人自食惡果不足惜阐肤,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呼巴。 院中可真熱鬧泽腮,春花似錦、人聲如沸衣赶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽府瞄。三九已至碧磅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遵馆,已是汗流浹背鲸郊。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留货邓,地道東北人秆撮。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像换况,于是被迫代替她去往敵國和親职辨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • http header 消息通常被分為4個部分:general header即頭部, request header...
    徐薇薇閱讀 31,978評論 0 5
  • iOS開發(fā)系列--網絡開發(fā) 概覽 大部分應用程序都或多或少會牽扯到網絡開發(fā)戈二,例如說新浪微博舒裤、微信等,這些應用本身可...
    lichengjin閱讀 3,641評論 2 7
  • 今天重新梳理網絡編程的時候觉吭,想到對于部分應用腾供,他們的數(shù)據(jù)流是按照http協(xié)議,中間經過其他協(xié)議層,最后通過底層的物...
    llicety閱讀 2,923評論 4 3
  • 有過開車經歷的人通常都清楚汽車發(fā)動機的啟動過程:將鑰匙右轉至點火位置伴鳖,此時需再右轉一下便聽到連續(xù)的“突突”聲节值,同時...
    不二純c閱讀 365評論 0 0