这个复选框式的验证码是如何工作的,我该如何使用它?

154

15
我也在正好相同的地方看到了它,想了完全相同的问题。我正在发布悬赏以吸引注意力。我也很好奇。 - Madara's Ghost
1
一个简单的方法是 $('form input[type=submit]').before('<div>你是人类吗?<input type="checkbox" name="captcha" /></div>'); 机器人不会勾选复选框,因为它不是表单的一部分。http://jsfiddle.net/s6jkchmz/ - TylerH
我在reCAPTCHA管理面板中没有看到相关设置,且当我尝试模仿OnePlus注册页面的布局时,收到了ERROR: Site key is not enabled for this API的错误提示。这似乎表明这是一种新的reCAPTCHA API,不是所有人都可以使用。 - Timothy Zorn
1
还有一种蜜罐方法,即在表单中放置一个不可抗拒的输入字段(如“评论”),然后用css/js将其隐藏。如果数据存在,则发送者是机器人。我曾经使用过这种方法,效果出奇地好。 - David H. Bennett
2
请注意:http://googleonlinesecurity.blogspot.hu/2014/12/are-you-robot-introducing-no-captcha.html - Pred
显示剩余4条评论
5个回答

117

此条目并未回答原始问题,但有助于实施类似的解决方案。 正如@IanM所说,复选框验证码处于测试阶段,没有邀请就不能使用。

重要更新 Google推出了新的reCAPTCHA

这是基于JavaScript的CAPTCHA。

由于大多数垃圾邮件机器人不执行JavaScript,并且无法识别显示的文本和DOM或所需操作之间的相关性,因此它们无法单击复选框。

请注意,根本没有复选框,它只是一个带有一些CSS样式的div元素。垃圾邮件机器人正在尝试填充表单输入元素,但CAPTCHA中没有输入。勾号只是另一个div(css类)。

当您点击该框时,ajax请求通知服务器已单击div,并且服务器将此信息存储在临时存储中(标记令牌:此令牌已被人类激活)。提交表单时,隐藏字段发送被激活的令牌,然后当服务器验证表单信息时,它将识别到令牌已被激活。如果未激活令牌,则表单将无效。

以下是步骤:

  • 生成唯一标识符并将其添加到带有隐藏输入的表单中
  • 在网站上呈现复选框(不使用元素,可能使用
    ),并将先前生成的标识符添加到其中(可以使用html5 属性)
  • 当用户单击复选框时,向服务器发送AJAX请求并验证CAPTCHA,如果有效,则将其标记为使用中。(向用户显示结果-标识符是否OK /不OK)
  • 当用户发送表单时,表单数据包含标识符。再次检查它,应该存在并处于使用中状态。
  • 如果所有验证都通过,则表单数据已准备好供使用/处理。

您可以将标识符绑定到用户的会话、IP地址和/或使用时间限制来提高安全性。

注意:仅当启用JavaScript时,此类CAPTCHA才有效!

注意:(编辑1)正如@crazypotato所述,有一些自动化工具可以执行JavaScript,这些工具也能够发送正确的AJAX请求并在复选框div上触发单击事件。

注意:(编辑2)请注意,针对特定网站编写的脚本或破解某种类型的验证码,迟早会成功。没有绝对的保护,您只能使机器人(或其开发人员)更加努力地工作。

注意:(编辑3)本答案中的步骤和描述仅包含有关此类验证码的一些基本信息,您始终需要添加其他验证和安全步骤以使其更加安全。例如,谷歌的noCaptcha在3次“div点击”后系统地触发标准reCaptcha。


4
我认为这个问题特别关注“如何在谷歌的reCAPTCHA中启用此功能?”我相信我能够自己实现它,但在他们的情况下并不那么简单。 - Madara's Ghost
如果您在Streetview页面底部点击“报告问题”,您会得到相同的新Recaptcha。那就是我第一次看到它并且发现这个SO页面时我开始搜索。 - user2605793
1
什么会阻止机器人发送那个ajax请求?如果每个人(或半大型网站)都实施这样的CAPTCHA,它肯定会被利用。Cloudflare有一个类似的机器人检测系统,似乎可以在不需要用户做任何事情的情况下工作。 - Steen Schütt
1
@Pred:“垃圾邮件机器人试图填写表单输入元素,但验证码中没有输入。”这太可悲了。jackiechanface.jpg - crazypotato
@crazypotato 你能否将CSS格式的div元素作为(x)HTML(5)输入框吗? - Pred
显示剩余4条评论

30

这是reCAPTCHA的beta API。我从他们JS API的源代码中发现了这一点:https://www.google.com/recaptcha/api.js 引用了“API2”。而且我还找到了这个链接:http://jaswsinc.com/recaptcha-ads/(已存档) 显然,他们进行了一个邀请制的beta测试,“无验证码的reCAPTCHA”,所以......你可能还不能在自己的网站上使用它。我没有找到任何有关加入beta测试的信息,但如果你搜索“无验证码reCAPTCHA beta测试”,你会看到很多人提到他们收到谷歌的电子邮件邀请他们加入。

如果你找到了加入beta测试的地方,请分享!否则,似乎公开发布将在2015年......


1
如果你在搜索“g-recaptcha”、“我不是机器人”或者“复选框”,你可以找到实现它的代码。你也可以尝试使用http://www.gstatic.com/recaptcha/api2/r20140903161709/recaptcha__en.js来 Frankenstein 一些东西。 - Ian M
3
电子邮件摘录:“我们预计在2015年将所有现有的reCAPTCHA站点迁移到新的API。” - Timothy Zorn
1
这是谷歌的博客文章,宣布了新的无验证码reCAPTCHA功能:http://googleonlinesecurity.blogspot.com/2014/12/are-you-robot-introducing-no-captcha.html - Nealvs
4
这里解释了新的“无需验证码reCAPTCHA”是如何工作的? - Nikhil Girraj
5
如果您想了解“无验证码reCAPTCHA”是如何工作的,我向您指出这篇文章(http://scraping.pro/no-captcha-recaptcha-challenge/)。 - Igor Savinkin
显示剩余5条评论

8

以下是我的PHP代码,它可以正常运行:

客户端代码:

<div class="g-recaptcha" data-sitekey="PUBLIC_KEY"></div>

服务器端:

if (isset($_POST['g-recaptcha-response'])) {
    $captcha = $_POST['g-recaptcha-response'];
    $privatekey = "SECRET_KEY";
    $url = 'https://www.google.com/recaptcha/api/siteverify';
    $data = array(
        'secret' => $privatekey,
        'response' => $captcha,
        'remoteip' => $_SERVER['REMOTE_ADDR']
    );

    $curlConfig = array(
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => $data
    );

    $ch = curl_init();
    curl_setopt_array($ch, $curlConfig);
    $response = curl_exec($ch);
    curl_close($ch);
}

$jsonResponse = json_decode($response);

if ($jsonResponse->success == "true")
    doSomething();
else
    doSomeOtherThing();

:)


你有没有遗漏客户端/HTML代码的某些部分?我只是问一下,因为在你的PHP代码中,你正在检查一个名为g-recaptcha-response的POST,但在你的客户端代码中没有定义这样的元素...我有什么遗漏吗? - benomatis
据我所知,g-recaptcha-response是reCAPTCHA返回的响应 - 如果它被填充,那么验证码已成功通过(由用户)。 - Hashim Aziz
通过一些搜索,已经确认 Confirmed - Hashim Aziz

5

我在搜寻中来到这里,没有找到答案,所以继续寻找。

在我的搜索之后,这个窗口仍然打开着,所以我用我的发现更新了这篇文章。

下面是关于reCAPTCHA的学习资料:

http://scraping.pro/no-captcha-recaptcha-challenge/

基本上,你需要将以下内容添加到你的网页中:

<script src="https://www.google.com/recaptcha/api.js" >;
<form method="post">
    <div class="g-recaptcha" data-sitekey="[site key issued by google]"></div>
    <input value="submit" type="submit" />
</form>

要获取您的reCAPTCHA密钥,请访问此Google网站:https://www.google.com/recaptcha/intro/index.html。一旦使用上述链接获得密钥,您可以使用以下Google信息更深入地进行编码:https://developers.google.com/recaptcha/
注意:根据Google文档,必须使用HTTPS协议加载脚本,并且可以从页面上的任何点无限制地包含。
以下是我成功运行它的示例:
<html>
<head>
    <title>Contact</title>
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    <script>
    var onloadCallback = function () {
        grecaptcha.render('dvCaptcha', {
            'sitekey': '<%=ReCaptcha_Key %>',
            'callback': function (response) {
                $.ajax({
                    type: "POST",
                    url: "CS.aspx/VerifyCaptcha",
                    data: "{response: '" + response + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (r) {
                        var captchaResponse = jQuery.parseJSON(r.d);
                        if (captchaResponse.success) {
                            $("[id*=txtCaptcha]").val(captchaResponse.success);
                            $("[id*=lblAlarm]").hide();
                        } else {
                            $("[id*=txtCaptcha]").val("");
                            $("[id*=lblAlarm]").show();
                            var error = captchaResponse["error-codes"][0];
                            $("[id*=lblAlarm]").html("RECaptcha error. " + error);
                        }
                    }
                });
            }
        });
    };
    </script>
</head>
<body>
    <form action="?" method="POST">
        <div id="dvCaptcha" class="g-recaptcha" data-sitekey="[site key issued by google]"></div>
        <br />
        <asp:Button ID="btnSubmit" runat="Server" Text="Send" OnClick="btnSubmit_Click" />
        <asp:Label ID="lblAlarm" runat="server" ForeColor="Red"></asp:Label>
    </form>
</body>
</html>

如果你需要在ASP.NET代码后端进行验证,只需验证“g-recaptcha-response”控件是否已填写:

protected static string ReCaptcha_Key, ReCaptcha_Secret;

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (!String.IsNullOrEmpty(Request.Form["g-recaptcha-response"]))
    {
        // other code
    } else
    {
       lblAlarm.Text = "reCAPTCHA failed.";
    }
}

希望这对你们中的一些人有用。


3
感谢大家对该主题的贡献,很高兴看到这么多人对新的reCAPTCHA工具感兴趣。
我没有找到它的.NET实现,所以建立了一个简单的Web Forms控件,您可以在此处找到:https://github.com/pnmcosta/recaptchav2dotnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接