web-dev-qa-db-ja.com

netcatでHTTPを介してURLを取得するにはどうすればよいですか?

なぜ私がbad requestこのコマンドの実行中

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\n\n" | nc www.yellowpages.com 80 

同じWebサイトがブラウザーで正常に開きます。

5
Madhur Ahuja

HTTPリクエストのヘッダーはCRLF(Windows)の行末を使用する必要があります。 ( Wikipedia または RFC 2616 を参照してください。)多くのサーバーはLF(Unix)行末を拡張子としてサポートしていますが、これはサポートしていません。

さらに、HTTP 1.1では Warren Youngが指摘 のようにHost:ヘッダー行が必要です。 ( Wikipedia または RFC 2616 を参照)。

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\r\nHost: www.yellowpages.com.eg\r\n\r\n" | nc www.yellowpages.com 80

より読みやすい

sed $'s/$/\r/' <<EOF | nc www.yellowpages.com 80
GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1
Host: www.yellowpages.com.eg

EOF

しかし、汗をかかずに有効なリクエストを作成し、必要に応じてカスタムヘッダーを指定できるようにするwgetまたはcurlを使用しないのはなぜですか?

GETリクエストにドメイン名を含める必要があります。接続するドメイン名をncに伝えましたが、サーバーの検索場所がわかっていますが、ncはそれをサーバーに渡しません。サーバーが複数のドメインをホストしている場合は、どのドメインを送信するかがわかりません。 echoで渡すリクエストヘッダーには、次のようにこの完全なドメインを含める必要があります。

echo "GET http://domain.tld/path" | nc domain.tld 80

-e引数をエコーにドロップして、最後にエスケープされた改行を追加することもできます。 -eは、エコーが自然に改行を追加する傾向を抑制しているため、自分で追加します。

編集1:ヘッダーのすべての可能性を処理して提供できるcurlのような通常のダウンロードツールを使用していない理由がありますか有用な出力?ヘッダーチャットを自分で処理する必要がありますか? curl http://domain.tld/pathを使用すると、プログラマーがすべての可能性について既に取り組んでいるため、より信頼性の高い出力が得られます。

編集2:プロトコル仕様の詳細については、 Warren's answer を参照してください。 TL; DR:1.1を指定した場合、そのプロトコルに準拠する必要があります。 1.0を指定すると、通常は上記のように要求を行うことができます。

HTTP/1.1を使用して、echoおよびnetcatで要求を行います。これを試してください。

echo "GET http://domain.tld/path HTTP/1.1\nHost: domain.tld\n" | nc domain.tld 80
4
Caleb

HTTP 1.1 必須 GETリクエストで少なくともHostヘッダーを送信すること。つまり、最小の法的要求は次のようになります。

GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com

(もちろん、ヘッダーセクションを終了するための追加のCRLFもあります。)

HTTP 1.1が必要であると主張する要求に対処するHTTPサーバーが存在する場合がありますが、Hostヘッダーは含まれていませんが、サーバーはそのような要求を拒否するのに適しています。

Hostは、名前ベースの仮想ホスティングをサポートするために必要なHTTP 1.1拡張です。アクセスしようとしているサイトに専用サーバー(または少なくとも専用IP)がある場合は、安全にHTTP 1.0に戻すことができます。これにより、単一行のHTTPリクエストを作成できます。

GET http://www.example.com/noise/and/junk HTTP/1.0
4
Warren Young