18

私は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);
4

4 に答える 4

21

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

  1. ブラウザーとまったく同じヘッダーを渡します (つまり、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);
    

そして、何も見逃していないことを祈ってください!

于 2012-02-22T09:05:33.037 に答える
17

サーバーは cURL リクエスト自体をブロックすることはできませんが、気に入らないリクエストはブロックできます。サーバーが、cURL 要求が満たさないいくつかのパラメーターをチェックする場合、別の応答を決定する可能性があります。

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

ブラウザーからの HTTP 要求がどのようなものかを調べるには、Fiddlerなどの HTTP デバッグ プロキシまたはブラウザーの開発者ツールを使用します。

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

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
于 2012-02-22T08:18:48.623 に答える
5

「CURL リクエストをブロックする方法はありますか?」という質問に答えるには、: はい、実際にはUser-Agentヘッダーを読み取ることで cURL リクエストを検出することができます。

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

于 2012-02-22T08:18:03.530 に答える