PHP で reCAPTCHA を使用する

重要: reCAPTCHA API のバージョン 1.0 のサポートは終了しました。バージョン 2.0 にアップグレードしてください。詳細

reCAPTCHA PHP ライブラリには、PHP ウェブサイトに CAPTCHA を配置して bot による悪用を防ぐ簡単な方法が用意されています。このライブラリは reCAPTCHA API をラップしています。

PHP で reCAPTCHA を使用するには、reCAPTCHA PHP ライブラリをダウンロードします。必要なファイルは 1 つだけです(recaptchalib.php)。その他のファイルはサンプル、readme、法律上のファイルで、機能には影響しません。

クイック スタート

API キーを登録したら、以下の基本的な手順に沿ってサイトに reCAPTCHA をインストールします。PHP プラグインの完全なリファレンス ガイドをご覧ください。

クライアント サイド(キャプチャ画像の表示方法)

PHP ライブラリを使用して reCAPTCHA ウィジェットを表示する場合は、reCAPTCHA ウィジェットが配置される <form> 要素内に次のコード スニペットを挿入する必要があります。

  require_once('recaptchalib.php');
  $publickey = "your_public_key"; // you got this from the signup page
  echo recaptcha_get_html($publickey);

コードを適用すると、フォームは次のようになります。

  <html>
    <body> <!-- the body tag is required or the CAPTCHA may not show on some browsers -->
      <!-- your HTML content -->

      <form method="post" action="verify.php">
        <?php
          require_once('recaptchalib.php');
          $publickey = "your_public_key"; // you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?>
        <input type="submit" />
      </form>

      <!-- more of your HTML content -->
    </body>
  </html>

忘れずに your_public_key を実際の API 公開鍵に置き換えて、$publickey を設定してください。

「action」属性の値が「verify.php」であることにご注意ください。Verify.php は、このフォームの値が送信される宛先ファイルになります。そのため、クライアントの html と同じ場所に verify.php というファイルが必要になります。

上記の例の need_once 関数は、recaptchalib.php がフォーム ファイルと同じディレクトリにあることを想定しています。別のディレクトリにある場合は、適切にリンクする必要があります。たとえば、recaptchalib.php がフォーム ファイルと同じレベルの「captcha」ディレクトリにある場合、関数は require_once('captcha/recaptchalib.php') のようになります。

サーバーサイド(ユーザーが正しい回答を入力しているかどうかをテストする方法)

次のコードを Verify.php ファイルの先頭に配置する必要があります。

  <?php
  require_once('recaptchalib.php');
  $privatekey = "your_private_key";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

  if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
         "(reCAPTCHA said: " . $resp->error . ")");
  } else {
    // Your code here to handle a successful verification
  }
  ?>

上記のコードの内容は次のとおりです。

  • recaptcha_check_answer は、ユーザーがチャレンジを正常に完了したかどうかを表すオブジェクトを返します。
  • $resp->is_valid が true の場合、キャプチャ チャレンジは正常に完了しているため、フォームの処理を続行する必要があります。
  • $resp->is_valid が false の場合、ユーザーは正しいキャプチャ テキストを入力できなかったので、フォームを再表示してもう一度入力できるようにする必要があります。この場合、$resp->errorrecaptcha_get_html に指定できるエラーコードになります。エラーコードを渡すと、reCAPTCHA コントロールに、ユーザーが入力したテキストに誤りがあるため再試行する必要があることを示すメッセージが表示されます。
  • このコードは、秘密鍵を要求していることに注意してください。この秘密鍵を公開鍵と混同しないでください。これは公開鍵と同じページから取得できます。

    また、フォームで $_REQUEST ではなく $_POST を使用してフォーム変数を取得する設定になっていることと、フォーム自体で POST メソッドが使用されていることもご確認ください。

    これで、reCAPTCHA がサイトで機能するようになりました。

    関連情報

  • デザインのカスタマイズ
  • ヒントとガイドライン
  • トラブルシューティング
  • PHP プラグイン リファレンス ガイド

    以下は、reCAPTCHA PHP プラグインで使用できるすべてのメソッドを網羅したリストです。

    recaptcha_get_html 関数

    recaptcha_get_html 関数は、reCAPTCHA をユーザーに表示する HTML を表示します。

    recaptcha_get_html
    パラメータ
    $pubkey -- 文字列。必須。 API 登録ページにある reCAPTCHA 公開鍵
    $error -- 文字列。省略可(デフォルトは null) この文字列が設定されている場合、指定したエラーコードが reCAPTCHA 領域に表示されます。このエラーコードは ReCaptchaResponse->$error から表示されます。
    $use_ssl -- ブール値。省略可(デフォルトは false) SSL ベースの API を使用するべきですか?SSL を介してユーザーにページを表示する場合は、このフィールドを true に設定して、ユーザーのブラウザにエラー ダイアログが表示されないようにします。
    戻り値 ウェブページに配置する HTML を含む文字列。

    recaptcha_check_answer 関数

    ユーザーが CAPTCHA の回答を含め HTML フォームに入力したら、recaptcha_check_answer 関数を使用してフォームを送信するときにその回答を確認します。ユーザーの回答は、recaptcha_challenge_fieldrecaptcha_response_field の 2 つのフォーム フィールドに表示されます。reCAPTCHA ライブラリが reCAPTCHA サーバーに HTTP リクエストを行い、ユーザーの回答を確認します。

    recaptcha_check_answer
    パラメータ
    $privkey -- 文字列。必須。 API 登録ページにある reCAPTCHA 秘密鍵。
    $remoteip -- 文字列。必須。 ユーザーの IP アドレス(192.168.0.1 の形式)
    $challenge -- 文字列。必須。
    フォーム フィールド recaptcha_challenge_field の値。
    $response -- 文字列。必須 フォーム フィールド recaptcha_response_field の値。
    戻り値 ReCaptchaResponse クラスのインスタンス

    ReCaptchaResponse
    フィールド
    $is_valid -- ブール値 reCAPTCHA は回答が有効であると判断しましたか?
    $error -- 文字列 回答が無効な場合、何が問題でしたか?このエラーコードは recaptcha_get_html で使用できます。
    戻り値 メールアドレスをデコードするための HTML または未加工の URL(呼び出した関数によって異なります)。

    Mailhide

    reCAPTCHA PHP ライブラリには、Mailhide API のバインディングが含まれています。この API を使用すると、exam...@example.com というメールを reCAPTCHA でラップしてスパマーに見られるのを防ぐことができます。

    PHP ライブラリの Mailhide 部分には PHP mcrypt モジュールが必要です。

    Mailhide API は recaptcha_mailhide_htmlrecaptcha_mailhide_url の 2 つの関数で構成されています。これらの関数のパラメータは同じです。_html バージョンはウェブページに直接配置できる HTML を返します渡されるメールのユーザー名部分は切り捨てられ、Mailhide を呼び出すリンクに置き換えられます。_url を使用すると、メールをデコードするための URL が提供されます。メールは HTML で配置されます。

    recaptcha_mailhide_url / recaptcha_mailhide_html
    パラメータ
    $pubkey -- 文字列 登録ページの Mailhide 公開鍵
    $privkey -- 文字列 登録ページの Mailhide 秘密鍵
    $email -- 文字列 非表示にするメールアドレス。

    次の例は、Mailhide の使用方法を示しています。

    <html><body>
    <?
    require_once ("recaptchalib.php");
    // get a key at http://www.google.com/recaptcha/mailhide/apikey
    $mailhide_pubkey = '';
    $mailhide_privkey = '';
    ?>
    The Mailhide encoding of example@example.com is
    <?
    echo recaptcha_mailhide_html ($mailhide_pubkey,
                                  $mailhide_privkey,
                                  "example@example.com");
    ?>.
    <br>
    The url for the email is:
    <?
    echo recaptcha_mailhide_url ($mailhide_pubkey,
                                 $mailhide_privkey,
                                 "example@example.com");
    ?>
    <br>
    </body></html>