web-dev-qa-db-ja.com

サーバーはcurlリクエストをブロックできますか?

私はZOHO APIに取り組んでおり、cURLを使用してレコードを更新しようとしています。さまざまなcURLのバリエーションを試しましたが、常に「false」を返します。しかし、ブラウザを使用して同じURLを呼び出すと、機能します。

彼らがcURLリクエストをブロックする方法はありますか? POSTまたはGETリクエストを使用してそのURLを呼び出すことができる他の方法はありますか?

私が試したcURLコードは次のとおりです:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
17

サーバーはcURLリクエスト自体をブロックすることはできませんが、不要なリクエストはブロックできます。サーバーがcURLリクエストが満たさないいくつかのパラメーターをチェックする場合、別の方法で応答することを決定できます。

ほとんどの場合、この動作の違いは、HTTPリクエストヘッダーの存在(または不在)と値によって引き起こされます。たとえば、サーバーはUser-Agentヘッダーが存在し、有効な値を持っています(他の多くのものもチェックできます)。

ブラウザーからのHTTPリクエストがどのように見えるかを確認するには、 Fiddler などのHTTPデバッグプロキシまたはブラウザーの開発者ツールを使用します。

独自のヘッダーをcURLリクエストに追加するには、次を使用します

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
15
Jon

多くのWebサーバーは、ボットの悪用を防ぐために、ブラウザー以外のものによって偽造されたHTTP要求をブロックしたいと考えています。ブラウザからのリクエストをシミュレート/見せかけたい場合は、少なくとも次のことを行う必要があります。

  1. ブラウザとまったく同じヘッダーを渡します(ie Firebug を使用して取得します)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
  2. ユーザーエージェント(ブラウザの名前)を変更する

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    
  3. Cookieを有効にする(リダイレクトやセッション処理など)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    
  4. リファラーを追加

    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    

そして、あなたが何も見逃していないことを祈ります!

21
Tom Desp

あなたの質問に答えるために"CURLリクエストをブロックする方法はありますか?":はい、実際には、_User-Agent_ヘッダーを読み取ることでcURLリクエストを検出できます。

curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');を呼び出すことにより、ユーザーエージェントを変更できます。

5
Vitamin

これについてもう少し詳しく説明するために、curl_setopt($ ch、CURLOPT_USERAGENT、 'Mozilla/5.0');を使用できます。またはユーザーエージェントを偽装するようなもの。この場合、サーバーは、Firefoxブラウザーが要求を行っていると見なします。

0
ashton gleason