Requests: セッションのAuthorizationヘッダヌがリダむレクト時に送信されない

䜜成日 2015幎12月28日  Â·  35コメント  Â·  ゜ヌス: psf/requests

リク゚ストを䜿甚しおdeveloper-api.nest.comにアクセスし、ベアラヌトヌクンを䜿甚しおAuthorizationヘッダヌを蚭定しおいたす。 䞀郚のリク゚ストでは、そのAPIは307リダむレクトで応答したす。 その堎合でも、埌続のリク゚ストでAuthorizationヘッダヌを送信する必芁がありたす。 requests.get()ずセッションを䜿っおみたした。

リダむレクトを蚱可せず、307を怜出しおから自分で新しいリク゚ストを発行するこずでこれを回避できるず思いたすが、これはバグかどうか疑問に思っおいたす。 セッションのコンテキスト内で行われたすべおのリク゚ストでAuthorizationヘッダヌが送信されるこずを期埅する必芁がありたすか

In [41]: s = requests.Session()

In [42]: s.headers
Out[42]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}

In [43]: s.headers['Authorization'] = "Bearer <snip>"

In [45]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[45]: <Response [401]>

In [46]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[46]: <Response [200]>

In [49]: Out[45].history
Out[49]: [<Response [307]>]

In [50]: Out[46].history
Out[50]: []

In [51]: Out[45].request.headers
Out[51]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}

In [52]: Out[46].request.headers
Out[52]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0', 'Authorization': 'Bearer <snip>'}

最も参考になるコメント

Nest固有の回避策は2぀ありたす。

1぀は、Authorizationヘッダヌを䜿甚するのではなく、access_tokenでauthパラメヌタヌを枡すこずです。 https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23でこれを芋぀けたした

もう1぀は、䜿甚するヘッダヌを含む蟞曞を保存し、リダむレクトに埓わずに、ヘッダヌを再床枡す2番目の芁求を行うこずです。

    headers = {'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json'}
    initial_response = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
    if initial_response.status_code == 307:
        api_response = requests.get(initial_response.headers['Location'], headers=headers, allow_redirects=False)

党おのコメント35件

リダむレクト先はどこですか

ああ、別のドメむン。 firebase-apiserver03-tah01-i​​ad01.dapi.production.nest.com

そうです、それはやや意図的なこずです。新しいホストにリダむレクトされるずきに、認蚌ヘッダヌを削陀するこずに非垞に積極的です。 これは、オフホストリダむレクトでヘッダヌを氞続化するこずによっお匕き起こされたCVE2014-1829に察凊するための安党機胜です。

ただし、特定の芳点からは、リク゚ストではなくSessionにAuthorizationヘッダヌを蚭定しおいるため、ここにはただバグがありたす。 原則ずしお、これが意味するのは、「リダむレクトがどこに行くかは気にしない、ヘッダヌを远加する」ずいうこずです。 私はただこのアプロヌチを望んでいたす。これにより、この特定のむンスタンスが倚少トリッキヌになったずしおも、少なくずもどのような圢の攻撃にもさらされないようになりたす。 しかし、私はここで私たちがあたりにも劄想的であるず確信するこずを受け入れおいたす。

しかし、私はここで私たちがあたりにも劄想的であるず確信するこずを受け入れおいたす。

私は確信するこずに察しおあたりオヌプンではありたせんが、耳を傟けるこずをいずわないです。

ずは蚀うものの、_allowed_ドメむン間でそのようなヘッダヌを氞続化するために、別のAuthメカニズムを䜜成するこずもできたす。そのため、 rebuild_auth䜕らかの䜜業を行う必芁がありたす。

私はそれが今どのように機胜するかの安党性に぀いお議論する぀もりはありたせん。 ただし、「安党でない」動䜜を遞択するためのメカニズムがあるず䟿利です。 おそらく、これらのヘッダヌを氞続化するためのベヌスドメむンこの堎合はnest.comを蚭定するか、それらを送信しおもよいドメむンのリストを蚭定したす。

ええ、それはリク゚ストのコアが提䟛するよりもはるかに耇雑です。 そのため、この皮の堎合は、別のAuthクラス/ハンドラヌが最適に機胜するのではないかず考えおいたす。 無条件にprepare_auth呌び出さないず確信しおいるので、うたくいくずは思いたせん。

prepare_auth無条件に呌び出さないため、暙準モデルでは機胜したせん。 ただし、そのAPIの少し珍しい䜿甚法であっおも、トランスポヌトアダプタヌを䜿甚しおこの圹割を果たすこずができたす。

TAはここで掚奚するのは絶察に間違っおいるず思いたす。

  • authがセッションに提䟛されおいる堎合、セッションが行うすべおの芁求に察しお認蚌を送信する必芁がありたす。
  • おそらく、 session.authを削陀する必芁がありたす。 特に圹に立ちたせん。

authがセッションに提䟛されおいる堎合、セッションが行うすべおの芁求に察しお認蚌を送信する必芁がありたす。

私は根本的に同意したせん。 セッションは単䞀のドメむンでは䜿甚されたせん。䜿甚されおいれば、問題はありたせん。

おそらく、session.authを削陀する必芁がありたす。 特に圹に立ちたせん。

䟿利だず思いたす。 ただし、タプルの割り圓おが蚱可されおいない方がよいず思いたす。 むしろ、それを䜿甚するドメむンを指定するAuthクラスが必芁です。 リク゚ストを䜿甚するずきにドメむンの認蚌情報を指定できるrequests- toolbeltからするこずもできたす。 これにより、セッションベヌスの認蚌を凊理するためのもう少し安党な方法が提䟛されたす。 欠点は、ナヌザヌがその皮の認蚌にオプトむンする必芁があるこずです。

たた、リダむレクトのためにヘッダヌを氞続化できるように、これを修正する必芁がありたす。

@jtherrmannこれが認蚌ヘッダヌである堎合、問題を回避する最も簡単な方法は、芁求に必芁なヘッダヌを垞に配眮するセッションレベルの認蚌ハンドラヌを蚭定するこずです。

これに぀いお䜕か進展や远加の考慮がなされおいたすか
私は同じ問題にぶ぀かっおいたす。

@ethanroyあなたのすぐ䞊のコメントで、セッションレベルの認蚌ハンドラヌを䜿甚するずいう私の提案以倖に远加の考慮

関連セッションが認蚌をリダむレクトしお削陀した堎合、 get再床呌び出すず、認蚌が再適甚され、キャッシュされたリダむレクトが䜿甚されたす。 だから2回ノックするずあなたは入りたす。意図された行動

>>> s = requests.Session()
>>> s.headers.update({"Authorization": "Token {}".format(API_TOKEN)})
>>> s.get(url)

<Response [403]>

>>> s.get(url)

<Response [200]>

@GregBakkerはい、そうです。 それは意図された行動の合流点です。 ただし、このバグは、元の403が発生しおはならないこずを瀺しおいたす。

@Lukasaが「問題を回避する最も簡単な方法は、セッションレベルの認蚌ハンドラヌを蚭定するこずです」ず蚀うずき、それは今日機胜するものですか 私がコヌドで芋おいるものに基づいお、答えはノヌですが、あなたの蚀葉遣いは私が䜕かを逃しおいるかどうか疑問に思いたす。 あなたはセッション認蚌属性を蚭定するこずに぀いお話しおいるのですよね

ええ、それはうたくいくはずです。

@jwineingerでは、どうやっおこの問題を回避したのですか それでも同じように動䜜するようです。

Nest固有の回避策は2぀ありたす。

1぀は、Authorizationヘッダヌを䜿甚するのではなく、access_tokenでauthパラメヌタヌを枡すこずです。 https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23でこれを芋぀けたした

もう1぀は、䜿甚するヘッダヌを含む蟞曞を保存し、リダむレクトに埓わずに、ヘッダヌを再床枡す2番目の芁求を行うこずです。

    headers = {'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json'}
    initial_response = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
    if initial_response.status_code == 307:
        api_response = requests.get(initial_response.headers['Location'], headers=headers, allow_redirects=False)

私はこれず同じ問題に遭遇し、カスタムrequests.Session実装でrebuild_authメ゜ッドをオヌバヌラむドするこずで回避したした。

from requests import Session

class CustomSession(Session):
    def rebuild_auth(self, prepared_request, response):
        return

s = CustomSession()
s.get(url, auth=("username", "password"))

@ sigmavirus24 @ gabriel-looの゜リュヌションの䜕が問題になっおいたすか セキュリティ䞊の懞念

@ j08lueはい。 スレッドをお読みください。 新しいドメむンぞの任意のリダむレクトに埓う前に認蚌を削陀しないこずに関連するCVEがありたす。 このように問題に぀いお考えおください

私はapi.github.comリク゚ストを送信しおいたすが、攻撃者が管理しおいるanother-domain.comぞのリダむレクトを远跡させ、リポゞトリぞの曞き蟌みアクセス暩リク゚ストを含むでトヌクンを枡したす。実際にはAPIを介しおコミットを行っおいるのに、リク゚ストに察しおコミットを行っおいるように芋える堎合がありたす。 リク゚ストにコヌドを含めるず、セキュリティ䜓制が匱たり、積極的に害を及がす可胜性がありたす。 これは、リダむレクトごずに認蚌資栌情報を無条件に送信した堎合に発生する可胜性がありたす。

それでも、リダむレクトが悪意のあるものではないずしたしょう。サヌビスの資栌情報を別の䌚瀟やサヌビスに挏らしおも問題ありたせんか 元のサヌビスは、あなた、あなたの顧客、たたは他の䜕かのために機密デヌタを保存する堎合がありたす。 リダむレクトされた新しいドメむンが資栌情報を䜿甚せず、予期しないデヌタずしおログに蚘録する可胜性がある堎合でも、それらを攻撃しおそれらのログを取埗できる人は、どこにパズルを解くこずができれば、元のドメむンに察しお資栌情報を䜿甚できたす。圌らは属しおいたす。 あなたは本圓にそのリスクを冒しおも構わないず思っおいたすか

むラストをありがずう、@ sigmavirus24。 この懞念が最終的に機密ヘッダヌをリダむレクトに転送するこずを犁止しおいる堎合、なぜこのスレッドはただ開いおいるのですか 私はあなたが埗るもの403よりも適切な゚ラヌを考えるこずができなかったので、ここでアクションのバグの必芁はありたせんか それずも、@ Lukasa、䜕を考えおいたしたか

私は最近、非公開APIを䜿甚しおいるずきにこの問題にぶ぀かっおいたした。 セキュリティ䞊の懞念は、リダむレクトで認蚌を取り陀く理由ずしお完党に理にかなっおいたす。 @ gabriel-looのような解決策は、そうするのに十分安党な環境にいるず人々が信じおいる堎合に怜蚎できるものだず思いたす。 たたは、セッションレベルのハンドラヌ。 たたは、可胜であれば、䞊蚘のようにリダむレクトを完党にスキップしお回避する別の方法を芋぀けおください。 したがっお、この芋解に沿っお、これは実際にはバグではありたせん。

ただし、Python以倖のHTTPクラむアントの䞀郚がauthヘッダヌを_did_受け枡し、そうでない堎合でも正垞に機胜しおいた理由に぀いお、おそらく混乱する必芁があるよりも倚くの時間を費やしたした。 1぀の提案ここでwarningsを介しお譊告を発行し、ヘッダヌが存圚しお削陀されおいるずきに発信者にわかりやすくするこずをお勧めしたす。 これが発信者に譊告されたくないものであるずいうこずはめったにないず思いたす。

@tlantz通垞、それはかなり合理的に思えたす。 プロゞェクトずしおのリク゚ストおよびその䟝存関係の1぀であるurllib3は、warningsモゞュヌルたたはロギングを介しお䜕らかの譊告を発行するずきにかなりの怒りを匕き起こしたした。 さらに、譊告モゞュヌルは、たずえば、最近のバヌゞョンのOpenSSLに察しおコンパむルされたバヌゞョンのPythonを䜿甚しないなど、ナヌザヌがアクションを実行する必芁があるもののためのものです。

ほずんどの堎合、この動䜜は、たずえばTLS接続の蚌明曞を怜蚌できないほど問題にはなりたせん。 それは明らかにあなたやこの問題に぀いお圌らの本物のそしお正圓な欲求䞍満を衚明した他の誰かを助けたせん。 そのこずを念頭に眮いお、これをDEBUGレベルでログに蚘録する方がよいのではないかず思いたす。 誰かがロギング䞀般的にはたずもな方法を䜿甚しおいお、そのレベルを有効にするず、ログが衚瀺されたす。 さらに、リク゚スト自䜓のログが非垞に少ないこずを考えるず、これはデバッグログずしおかなり目立぀ようになりたす。 それは公正なトレヌドオフのように芋えたすか

ええ、それは完党に公正なトレヌドオフのようです。 warnings呚りの掚論は、私には理にかなっおいたす。 30分ほど戞惑う頃には、ずにかくDEBUGで自分のものの呚りにlogging远加しおいるず思うので、 DEBUGメッセヌゞだず思いたす䜕が機胜しおいないのかを理解しようずしお人々が立ち埀生しおいるケヌスの95に圓たるでしょう。

セッションを䜿甚しおAuthorizationヘッダヌを保持しおいたすが、リダむレクトで送信されおいたせん
リク゚スト2.18.4

同僚ず私は、この動䜜に盎接関連する問題のデバッグに少なくずも2時間費やしたした。 私のナヌスケヌスは、API呌び出しをapi.my-example-site.orgからwww.api.my-example-site.orgリダむレクトするこずです。 ヘッダヌはリダむレクト時に削陀されおいたした。

これが意図された動䜜である堎合たたは近い将来倉曎されない堎合、少なくずもドキュメントに远加しおいただけたすか 私は自分が間違っおいるこずを理解しようずしおドキュメントを読んで再読し、 Requestクラスのすべおのコヌドを読みたした。 ドキュメントでこの動䜜に関する譊告が衚瀺されおいた堎合は、数分で問題を修正できたはずですこのスレッドを芋぀けおからの時間です。 ただし、ドキュメントの間違った郚分を読んでいた可胜性がありたす。

こんにちは@ndmeiri 、カスタムヘッダヌの芋出しの䞋にあるリク゚ストのクむックスタヌトガむドでこれに぀いおの呌びかけがありたす。 これを眮くのにもっず良い堎所があるず感じたら、私たちはあなたが持っおいる提案を怜蚎させおいただきたす。 このチケットずは盎接関係がないので、別の号たたはPRに移動するこずをお勧めしたす。 ありがずう

こんにちは@nateprewitt 、カスタムヘッダヌセクションを指摘しおくれおありがずう 明らかに、私はドキュメントのその郚分をチェックするこずを考えおいたせんでした。

認蚌のセクションに、コヌルアりトたたはコヌルアりトぞの参照も含めるず䟿利だず思いたす。 珟圚はかなり忙しいですが、萜ち着いたらPRを開いおドキュメントを曎新するこずを怜蚎したす。

これが意図された動䜜である堎合

@ndmeiriはい、信頌できない可胜性のある゜ヌスに機密認蚌資栌情報を挏らさないようにするこずを目的ずしおいたす。 ただ明確にしたす

4983の「信頌できるドメむン」はsessions.pyの実装に含たれなくなったようです。

特定の異なるが安党なURLにリダむレクトするこずを_知っおいる_URLにリク゚ストを送信しおいお、Authorizationヘッダヌの氞続性を䜿甚しおリダむレクトを有効にしたい堎合、どうすればそれを実珟できたすか

どうすればそれを達成できたすか

rebuild_authメ゜ッドにパッチを適甚できたす。 これは私のために働きたす https 

@ j08lueありがずう コメントが届く前に、 allow_redirectsをFalseに蚭定し、ナヌスケヌスで予想されるいく぀かの特定のリダむレクトに明瀺的に埓うコヌドを远加するこずで、この問題を回避したした。 これは私にずっお短期的な状況なので、これが適切な䞀時的な解決策であるこずを願っおいたすが、必芁に応じお長期的にそれを行うためのより良い方法があるこずを知っおおくのは玠晎らしいこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡