这个复选框 recaptcha 是如何工作的,我该如何使用它?

Posted

技术标签:

【中文标题】这个复选框 recaptcha 是如何工作的,我该如何使用它?【英文标题】:How does this checkbox recaptcha work and how can I use it? 【发布时间】:2014-10-22 02:55:29 【问题描述】:

我最近注册了一加一加网站https://account.oneplus.net/sign-up,并注意到这个复选框recaptcha

它是如何工作的,我如何在我的网站上使用它?比那些神秘的单词/数字好多了:)

recaptcha 网站没有提及任何新的 recaptcha 方法...https://www.google.com/recaptcha/intro/index.html

【问题讨论】:

我在完全相同的地方看到它,并且想知道完全相同的事情。我正在悬赏以吸引注意力。我也很好奇。 也许它正在测试中,尚未准备好发布? 一个简单的方法是$('form input[type=submit]') .before('<div>Are you a human? <input type="checkbox" name="captcha" /></div>'); 机器人不会选中该框,因为它不是表单的一部分。 jsfiddle.net/s6jkchmz 还有蜜罐方法,在表单中放置一个不可抗拒的输入字段(如'cmets'),然后用css/js将其隐藏。如果数据存在,则发送者是机器人。我用过这个,效果出奇的好。 仅供参考:googleonlinesecurity.blogspot.hu/2014/12/… 【参考方案1】:

此条目不回答原始问题,但它有助于实现类似的解决方案。 正如@IanM 所说,复选框recaptcha 处于测试阶段,无法使用没有邀请。

重要编辑 Google 推出了新的 reCAPTCHA

Google Online Security blog: Are you a robot? Introducing “No CAPTCHA reCAPTCHA” Google reCAPTCHA: Introducing the new reCAPTCHA!

这是一个基于 javascript 的验证码。

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

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

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

要点中的步骤:

生成唯一标识符并将其添加到带有隐藏输入的表单中 在网站上渲染一个复选框(不使用<input>元素,可能使用<div>)并将之前生成的标识符添加到它(您可以使用html5的data-*属性) 当用户点击复选框时,向服务器发送一个ajax请求并验证验证码,如果有效则标记为in use。 (向用户显示结果 - 标识符正常/不正常) 当用户发送表单时,表单的数据包含标识符。再检查一次,它应该存在并且应该处于in use 状态。 如果所有验证均通过,则表单数据即可使用/处理

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

注意这种验证码仅在启用 JavaScript 时有效!

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

注意(编辑 2)请注意,专门为一个站点编写的脚本或用于破解一种验证码的脚本迟早会通过。没有终极保护,您只能让机器人(或其开发人员)更加努力地工作。

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

【讨论】:

我认为问题是关于“如何使用 Google 的 reCAPTCHA 启用此功能?”我非常有信心自己可以实现这一点,但他们的情况并不是那么简单。 如果您单击街景页面底部的报告问题,您将获得相同的新验证码。那是我第一次看到它的地方,并在我搜索时找到了这个 SO 页面。 什么会阻止机器人发送该 ajax 请求?如果每个人(或半大型网站)都实施这样的验证码,无论如何它肯定会被利用。 Cloudflare 有一个类似的机器人检测系统,似乎不需要用户做任何事情就可以工作。 首先,我完全同意您的评论,是的,一个直接为利用一个站点而编写的机器人将会通过(对于任何类型的验证码都是如此)。我以most bots 而不是all bots 开始我的帖子。当基于图像的验证码破解器简单地将图像发送到软件和字符中的人类类型时,也有一些解决方案(并且员工通过成功发布的计数获得报酬)。你将如何防止这种情况发生? :) @Pred "垃圾邮件机器人正在尝试填充表单输入元素,但验证码中没有输入。"真可怜。 jackiechanface.jpg【参考方案2】:

这是一个用于 reCAPTCHA 的测试版 API。我从他们的 JS API 的来源收集到这个:https://www.google.com/recaptcha/api.js 引用“API2”。我还发现了这个:http://jaswsinc.com/recaptcha-ads/(archived) 显然他们做了一个仅限邀请的测试版“无验证码 reCAPTCHA”所以....你可能还不能让它在你的网站上运行。我找不到任何有关选择加入测试版的信息,但如果您搜索“No CAPTCHA reCAPTCHA beta”,您会看到很多人提到从 Google 收到电子邮件让他们加入。

如果您找到进入测试版的地方,请分享!否则看起来公开发布将在 2015 年推出......

【讨论】:

如果您搜索“g-recaptcha”、“我不是机器人”或“复选框”,您可以尝试使用 gstatic.com/recaptcha/api2/r20140903161709/recaptcha__en.js 一起 frankenstein 某事在那里找到实现它的代码。 摘自电子邮件:We expect to move all existing reCAPTCHA sites to the new API in 2015. 这是 Google 的博客文章,宣布了新的 No CAPTCHA reCAPTCHA 功能:googleonlinesecurity.blogspot.com/2014/12/… 这在哪里解释,新的No CAPTCHA reCAPTCHA 是如何工作的? @NikhilGirraj,如果你想知道No CAPTCHA reCAPTCHA 是如何工作的,我指点你this post。【参考方案3】:

这是我在 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 的帖子,但您的客户端代码中没有定义这样的元素......我错过了什么吗? @benomatis 据我了解,g-recaptcha-response 是 reCAPTCHA 返回的响应 - 如果已填充,则验证码已成功传递(由用户)。 Confirmed 有点搜索。【参考方案4】:

我在搜索中来到这里,没有看到答案,所以我一直在搜索。

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

您可以在这里了解 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.";
    

希望你们中的一些人觉得这很有用。

【讨论】:

【参考方案5】:

感谢大家对此主题的贡献,很高兴看到这么多人对新的 recaptcha 工具感兴趣。

我找不到它的 .net 实现,所以构建了一个简单的 Web 表单控件,你可以在这里找到 https://github.com/pnmcosta/recaptchav2dotnet

【讨论】:

以上是关于这个复选框 recaptcha 是如何工作的,我该如何使用它?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何让 Google reCaptcha 为 Flutter web 工作?

ReCaptcha v2 客户端事件

找到 reCAPTCHA 元素并点击它——Python + Selenium

如何使用recaptcha API

reCAPTCHA V3:空闲后如何处理过期令牌?