首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在服务器端验证Google reCAPTCHA v3?

如何在服务器端验证Google reCAPTCHA v3?
EN

Stack Overflow用户
提问于 2014-12-03 22:25:52
回答 7查看 131.6K关注 0票数 75

我刚刚设置了新的google recaptcha with checkbox,它在前端工作得很好,但我不知道如何在服务器端使用PHP处理它。我尝试使用下面的旧代码,但即使验证码无效也会发送表单。

代码语言:javascript
复制
require_once('recaptchalib.php');
$privatekey = "my key";
$resp = recaptcha_check_answer ($privatekey,
        $_SERVER["REMOTE_ADDR"],
        $_POST["recaptcha_challenge_field"],
        $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
 $errCapt='<p style="color:#D6012C ">The CAPTCHA Code wasnot entered correctly.</p>';}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-12-12 16:44:29

这就是解决方案

index.html

代码语言:javascript
复制
<html>
  <head>
    <title>Google recapcha demo - Codeforgeek</title>
    <script src='https://www.google.com/recaptcha/api.js'></script>
  </head>
  <body>
    <h1>Google reCAPTHA Demo</h1>
    <form id="comment_form" action="form.php" method="post">
      <input type="email" placeholder="Type your email" size="40"><br><br>
      <textarea name="comment" rows="8" cols="39"></textarea><br><br>
      <input type="submit" name="submit" value="Post comment"><br><br>
      <div class="g-recaptcha" data-sitekey="=== Your site key ==="></div>
    </form>
  </body>
</html>

verify.php

代码语言:javascript
复制
<?php
    $email; $comment; $captcha;

    if(isset($_POST['email']))
        $email=$_POST['email'];
    if(isset($_POST['comment']))
        $comment=$_POST['comment'];
    if(isset($_POST['g-recaptcha-response']))
        $captcha=$_POST['g-recaptcha-response'];

    if(!$captcha){
        echo '<h2>Please check the the captcha form.</h2>';
        exit;
    }

    $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true);
    if($response['success'] == false)
    {
        echo '<h2>You are spammer ! Get the @$%K out</h2>';
    }
    else
    {
        echo '<h2>Thanks for posting comment.</h2>';
    }
?>

http://codeforgeek.com/2014/12/google-recaptcha-tutorial/

票数 116
EN

Stack Overflow用户

发布于 2017-02-19 09:43:16

我不喜欢这些解决方案中的任何一个。我使用下面的代码:

代码语言:javascript
复制
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'secret' => $privatekey,
    'response' => $_POST['g-recaptcha-response'],
    'remoteip' => $_SERVER['REMOTE_ADDR']
]);

$resp = json_decode(curl_exec($ch));
curl_close($ch);

if ($resp->success) {
    // Success
} else {
    // failure
}

我认为这样做更好,因为您可以确保它是对服务器执行POSTed操作,而不是进行笨拙的“file_get_contents”调用。这与这里描述的reCAPTCHA2.0兼容:https://developers.google.com/recaptcha/docs/verify

我找到了这个清洁工。我发现大多数解决方案都是file_get_contents,当我觉得curl就足够了。

票数 24
EN

Stack Overflow用户

发布于 2016-09-14 17:07:44

我喜欢Levit的答案,并最终使用了它。但我只是想指出,以防万一,有一个针对新reCAPTCHA的官方Google PHP库:https://github.com/google/recaptcha

最新版本(目前为1.1.2)支持Composer,并包含一个示例,您可以运行该示例来查看是否正确配置了所有内容。

下面你可以看到这个官方库附带的示例的一部分(为了清楚起见,我做了一些细微的修改):

代码语言:javascript
复制
// Make the call to verify the response and also pass the user's IP address
    $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);

    if ($resp->isSuccess()) {
// If the response is a success, that's it!
        ?>
        <h2>Success!</h2>
        <p>That's it. Everything is working. Go integrate this into your real project.</p>
        <p><a href="/">Try again</a></p>
        <?php
    } else {
// If it's not successful, then one or more error codes will be returned.
        ?>
        <h2>Something went wrong</h2>
        <p>The following error was returned: <?php
            foreach ($resp->getErrorCodes() as $code) {
                echo '<tt>' , $code , '</tt> ';
            }
            ?></p>
        <p>Check the error code reference at <tt><a href="https://developers.google.com/recaptcha/docs/verify#error-code-reference">https://developers.google.com/recaptcha/docs/verify#error-code-reference</a></tt>.
        <p><strong>Note:</strong> Error code <tt>missing-input-response</tt> may mean the user just didn't complete the reCAPTCHA.</p>
        <p><a href="/">Try again</a></p>
    <?php
    }

希望这能帮助到别人。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27274157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档