なぜcurlとwgetは403を禁止しますか?


57

私は、ファイルをダウンロードしようとするwgetcurl、それは(禁断の)403エラーで拒否されます。

同じマシンのWebブラウザを使用してファイルを表示できます。

http://www.whatsmyuseragent.comで取得したブラウザーのユーザーエージェントで再試行します。私はこれをします:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

そして

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

しかし、それはまだ禁止されています。403には他にどのような理由がありますか?wgetおよびcurlコマンドを変更してそれらを克服する方法はありますか?

(これはファイルを取得できることではなく、ブラウザから保存するだけでよいことを知っています。コマンドラインツールの動作が異なる理由を理解することです)

更新

この質問に対する素晴らしい回答をありがとう。私が遭遇した特定の問題は、サーバーがリファラーをチェックしていたことです。これをコマンドラインに追加すると、curlとを使用してファイルを取得できますwget

リファラーをチェックしたサーバーは、302を介してチェックをまったく実行していない別の場所にバウンスしたため、そのサイトの1 curlつまたは複数wgetのサイトが正常に機能しました。

誰かが興味を持っているなら、私はこのページを読んで埋め込まれたCSSについて学び、サイトのCSSを例として見ようとしていたので、これが起こりました。私が問題を抱えていた実際のURLはこれであり、curl私はでした

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

そして、wgetは

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

とても興味深い。


7
リファラーをチェックするページは本当に迷惑です。ヘッダーはオプションであると想定されており、統計の収集に使用されます。
zaadeh

私が見つけた最も簡単なことは、それをzipファイルに変換し、そのように使用することです。
ピニイーニ

回答:


40

HTTP要求には、curlまたはwgetによって設定されないヘッダーがさらに含まれる場合があります。例えば:

  • Cookie:これは、リクエストが拒否される最も可能性の高い理由です。これはダウンロードサイトで発生します。Cookieを指定key=valすると、の-b key=val(または--cookie key=val)オプションで設定できますcurl
  • リファラー(原文):Webページ上のリンクをクリックすると、ほとんどのブラウザーは現在のページをリファラーとして送信する傾向があります。依存するべきではありませんが、このヘッダーがない場合、eBayでさえパスワードのリセットに失敗しました。そう、そうかもしれません。curlこのためのオプションがある-e URL--referer URL
  • 承認:これは、ユーザー名/パスワードダイアログの制御不能なUIにより、今ではあまり人気がなくなりつつありますが、それでも可能です。それはで設定することができcurl-u user:password(または--user user:password)オプション。
  • ユーザーエージェント:一部の要求は、ユーザーエージェントに応じて異なる応答を生成します。これは良い方法(実際のダウンロードではなく、ミラーのリストを提供する)または(が始まらないユーザエージェント拒否悪い方法で使用することができMozilla、または含まれているWgetcurl)を。

通常、ブラウザの開発者ツール(FirefoxおよびChromeはこれをサポートしています)を使用して、ブラウザから送信されたヘッダーを読み取ることができます。接続が暗号化されていない(つまり、HTTPSを使用していない)場合、この目的でWiresharkなどのパケットスニファーを使用することもできます。

これらのヘッダーに加えて、Webサイトは、状態を変更する舞台裏でいくつかのアクションをトリガーする場合があります。たとえば、ページを開くときに、ダウンロードリンクを準備するためにバックグラウンドで要求が実行される可能性があります。または、ページでリダイレクトが発生します。通常、これらのアクションはJavascriptを使用しますが、これらのアクションを容易にするための隠しフレームもあります。

あなたは簡単にダウンロードサイトからファイルを取得する方法を探しているなら、plowdownで見て、に含まれプラウシェア


別の本当にひねくれた可能性は、何らかの理由でサーバーが成功時に200ではなく403を返すように構成されたことです。
カスペルド14年

1
これは私に必要な手がかりを与えてくれました。Cookieを試してみたところ、リファラーが問題であることがわかりました(今では、それだけを正しく綴ることができれば!!!)
14年

2
それでも失敗する場合は、wget追加てみてください--auth-no-challenge。魔法のように機能します。
ジョナサン

13

上記の回答に加えて、Chrome開発者ツール(v26.0以降)およびFirebug(v1.12以降)にある「cURLとしてコピー」機能を使用できることを追加します。この機能にアクセスするには、[ネットワーク]タブでリクエスト行を右クリックします。


これは、特にChromeのツールで非常に役立ちました。firefoxで試してみたところ、302の後のリクエストヘッダーがすべて見えました。Chromiumでは両方を見ることができ、これにより問題を解決するための情報が得られました。
フライ14年

1
@starfry Enable persistent logsFirefoxの開発ツールの設定タブをチェックして、リダイレクトのネットワークログが消去されないようにする必要があります。Chromeにも同様のオプションがあります。ちなみに、「Copy as cURL」はFirefox Nightly / Aurora / Betaでしばらくの間使用されており、次のメジャーリリース(31.0)が予定されています。
ボブ14年

9

上記のすべてを試してみましたが、運はありません。次を追加すると、devブラウザツールを使用してユーザーエージェント文字列を取得し、成功しました。

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

5

あなたが何を求めているかに応じて、それはクッキーかもしれません。Firefoxを使用すると、問題のページである「ページ情報を表示」を右クリックできます。[セキュリティ]アイコンを選択し、[Cookieの表示]ボタンをクリックします。

Cookieを不可解にするには、Firefoxの「ライブHTTPヘッダー」プラグインが不可欠です。どのCookieが設定され、どのCookieがWebサーバーに送り返されるかを確認できます。

wgetCookieを使用できますが、Cookieを送信しなかったというヒントを与えないため、まったく腹立たしいものです。最善の策は、関連するすべてのCookieをブラウザから削除し、最初のログインまたはページ表示シーケンスを実行することです。CookieおよびPOSTまたはGETパラメーターについては、「ライブHTTPヘッダー」をご覧ください。wget「--keep-session-cookies」および「--save-cookies」オプションを使用して、最初のログイン手順を実行します。これにより、テキストエディターで表示できるCookieファイルが提供されます。wget --load-cookies次の手順でCookieファイルと共に使用します。


1
Firefoxでプライベートブラウジングウィンドウを開いてCookieなしでテストしたところ、予想どおり403エラーが発生しました。興味深いことに、新しいタブでエラーが表示されません。クロムでは、新しいタブが403を返す
starfry

1
ちなみに、Firefoxの開発ツールのネットワークタブを使用すると、アドオンなしで送受信されたCookieを検査できます。Chrome / Chromiumについても同じです。
ボブ14年

@bob-はい、わかりました。それは何かではなかったので、数分かかりました。Firebugには現在、CURLとしてコピーがありますが、ネイティブツールも参照してください。
スターフライ14年

1

これが発生するもう1つの理由は、サイトでSSLが必要な場合です。ブラウザはHTTPからHTTPSに自動的に転送しますが、curlとwgetは転送しません。そのため、HTTPではなくHTTPSを使用して要求を試行してください。


3
私が正しい場合、これはエラー301または302、リダイレクトで終了します。
-Jakuje
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.