將 reCAPTCHA 與 PHP 搭配使用

重要事項:系統已不再支援 reCAPTCHA API 1.0 版,請升級至 2.0 版。瞭解詳情

reCAPTCHA PHP 程式庫可讓您輕鬆在 PHP 網站上放置 CAPTCHA,以防止機器人濫用此程式庫。程式庫會納入 reCAPTCHA API

如要將 reCAPTCHA 與 PHP 搭配使用,您可以下載 reCAPTCHA PHP 程式庫。只需要一個檔案 (recaptchalib.php)。其他檔案為範例、README 和法律內容,不會影響功能。

快速啟動

註冊 API 金鑰後,請按照下列基本操作說明在網站上安裝 reCAPTCHA。以下提供 PHP 外掛程式的完整參考指南。

用戶端 (如何顯示人機驗證 (Captcha) 圖片)

如要使用 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 所在的位置中有一個 test.php 檔案。

上述範例中的 required_once 函式預期 recaptchalib.php 會與表單檔案位於相同的目錄中。如果檔案位於其他目錄中,請務必正確連結。 舉例來說,如果您的 recaptchalib.php 位於名為「captcha」的目錄中,且與表單檔案位於同一層級,函式看起來會像這樣:require_once('captcha/recaptchalib.php')

伺服器端 (如何測試使用者是否輸入正確答案)

下列程式碼應置於 validation.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,代表已正確完成人機驗證 (Captcha) 驗證,您應繼續處理表單。
  • 如果 $resp->is_valid 為 false,則使用者無法提供正確的人機驗證 (Captcha) 文字,您應重新顯示表單,以便他們再次嘗試。在這種情況下,$resp->error 會是可以提供給 recaptcha_get_html 的錯誤代碼。傳遞錯誤代碼後,reCAPTCHA 控制項會顯示訊息,說明使用者輸入了錯誤的文字,請重試。
  • 請注意,這個程式碼會要求「私密金鑰」,此金鑰不應與公開金鑰混淆。您就會看到與公開金鑰相同的頁面。

    此外,也請確認表單已設為使用 $_POST (而非 $_REQUEST) 取得表單變數,且表單本身使用的是 POST 方法。

    大功告成!reCAPTCHA 現在應該能在網站上正常運作。

    延伸閱讀

  • 自訂外觀和風格
  • 提示和指南
  • 疑難排解
  • PHP 外掛程式參考指南

    以下列出 reCAPTCHA PHP 外掛程式的所有方法。

    recaptcha_get_html 函式

    recaptcha_get_html 函式會顯示向使用者顯示 reCAPTCHA 的 HTML。

    recaptcha_get_html
    參數
    $pubkey -- string.必要項目。 API 註冊頁面中的 reCAPTCHA 公開金鑰
    $error -- 字串。選用 (空值為預設值) 如果設定這個字串,reCAPTCHA 區域會顯示指定的錯誤代碼。這個錯誤代碼來自 ReCaptchaResponse->$error
    $use_ssl -- boolean. optional (預設為 false) 是否應該使用以 SSL 為基礎的 API?如果您要透過安全資料傳輸層 (SSL) 向使用者顯示網頁,請務必將這個值設為 true,這樣使用者的瀏覽器就不會出現錯誤對話方塊。
    傳回值 包含要放在網頁的 HTML 字串。

    recaptcha_check_answer 函式

    使用者填妥 HTML 表單 (包括人機驗證 (CAPTCHA) 的答案) 後,我們會希望使用 recaptcha_check_answer 函式提交表單時,檢查作答內容。使用者的答案將分成兩個表單欄位:recaptcha_challenge_fieldrecaptcha_response_field。reCAPTCHA 程式庫會向 reCAPTCHA 伺服器發出 HTTP 要求,並驗證使用者的答案。

    recaptcha_check_answer
    參數
    $privkey -- string.必要。 您的 reCAPTCHA 私密金鑰 (來自 API 註冊頁面)。
    $remoteip -- 必要字串。 使用者的 IP 位址,格式為 192.168.0.1
    $challenge -- 字串。
    表單欄位 recaptcha_challenge_field 的值
    $response -- 字串。必要 表單欄位 recaptcha_response_field 的值
    傳回值 ReCaptchaResponse 類別的例項

    ReCaptchaResponse
    欄位
    $is_valid -- 布林值 reCAPTCHA 認為答案有效嗎?
    $error -- 字串 如果答案無效,請說明問題為何?這個錯誤代碼可用於 recaptcha_get_html
    傳回值 用來解碼電子郵件地址的 HTML 或原始網址 (取決於您呼叫的函式)。

    郵件隱藏

    reCAPTCHA PHP 程式庫包含 Mailhide API 的繫結。這個 API 可讓您將電子郵件包裝在 reCAPTCHA 中,防止垃圾郵件散佈者查看:exam...@example.com。

    PHP 程式庫的 Mailhide 部分需要 PHP mcrypt 模組。

    Mailhide API 包含兩個函式 recaptcha_mailhide_htmlrecaptcha_mailhide_url。函式的參數相同。_html 版本會傳回可直接放在網頁上的 HTML。傳入的電子郵件的使用者名稱部分會遭到截斷,並替換為呼叫 Mailhide 的連結。_url 版本可以提供網址,用於解碼電子郵件,然後您願意將電子郵件放在 HTML 中。

    recaptcha_mailhide_url / recaptcha_mailhide_html
    參數
    $pubkey -- string 申請頁面中的 Mailhide 公開金鑰
    $privkey -- string 申請頁面中的 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>