首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 空間不支持 Socket 時使用 cURL 實現 reCAPTCHA 驗證

     編輯:PHP 綜合知識

背景

部分虛擬主機禁用了 fsockopen 等 socket 函數,導致官方 recaptchalib.php 無法正常驗證。本文提供將驗證請求改為 cURL 方式的完整修改方案。

修改 recaptchalib.php 核心方法

1. 替換 _recaptcha_http_post 為 cURL 版本

function _recaptcha_http_post($host, $path, $data, $port = 80) {
    $req = _recaptcha_qsencode($data);
    $url = $host . $path;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

2. 微調 recaptcha_check_answer 解析邏輯

function recaptcha_check_answer($privkey, $remoteip, $challenge, $response, $extra_params = []) {
    // ... 參數校驗略 ...
    
    $response = _recaptcha_http_post(
        RECAPTCHA_VERIFY_SERVER, 
        "/recaptcha/api/verify",
        array_merge([
            'privatekey' => $privkey,
            'remoteip' => $remoteip,
            'challenge' => $challenge,
            'response' => $response
        ], $extra_params)
    );
    
    $answers = explode("\n", $response);
    $recaptcha_response = new ReCaptchaResponse();
    
    // 官方返回首行 "true" 或 "false"
    if (trim($answers[0]) === 'true') {
        $recaptcha_response->is_valid = true;
    } else {
        $recaptcha_response->is_valid = false;
        $recaptcha_response->error = $answers[1] ?? 'unknown';
    }
    return $recaptcha_response;
}

前端調用示例 demo.php

<form action="" method="post">
<?php
require_once('recaptchalib.php');
$publickey = "你的公鑰";
$privatekey = "你的私鑰";

$resp = null;
$error = null;

if ($_POST["recaptcha_response_field"]) {
    $resp = recaptcha_check_answer($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
    if ($resp->is_valid) {
        echo "驗證通過!";
    } else {
        $error = $resp->error;
        echo "錯誤:$error";
    }
}
echo recaptcha_get_html($publickey, $error);
?>
<br/>
<input type="submit" value="提交" />
</form>

關鍵點說明

  • cURL 版本無需 socket 支持,兼容性極佳。
  • 設置 CURLOPT_RETURNTRANSFER 直接獲取響應體,避免直接輸出。
  • 驗證邏輯以首行 true/false 判斷,更符合官方 API 文檔。
  • 申請密鑰地址:Google reCAPTCHA Admin
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved