此复选框recapcha的工作方式以及如何使用?


149

我最近注册了oneplusone网站https://account.oneplus.net/sign-up,并注意到此复选框已重新设置

复选框重新输入

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

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


14
我在完全相同的地方看到它,并且想知道完全相同的事情。我在悬赏金以引起注意。我也很好奇
马达拉的幽灵

也许它正在测试中,还没有准备好发布?
user3791372 2014年

1
一种简单的方法是,$('form input[type=submit]') .before('<div>Are you a human? <input type="checkbox" name="captcha" /></div>');机器人不会选中该框,因为它不是表单的一部分。jsfiddle.net/s6jkchmz
TylerH 2014年

1
还有蜜罐方法,将不可抗拒的输入字段放入表单中(例如“ comments”),然后使用css / js将其隐藏。如果存在数据,则发送者为机器人。我已经使用了它,并且效果惊人。
David H. Bennett

Answers:


30

这是用于reCAPTCHA的beta API。我从他们的JS API的源中收集了这一点:https : //www.google.com/recaptcha/api.js引用了“ API2”。而且我也发现了这一点:http : //jaswsinc.com/recaptcha-ads/显然他们做了他们的“ no CAPTCHA reCAPTCHA”的邀请版测试版,所以...。您的网站呢。我没有选择加入Beta的任何信息,但是如果您搜索“ No CAPTCHA reCAPTCHA beta”,您会看到许多人提到从Google接收电子邮件以使他们加入。

如果您找到进入测试版的地方,请分享!否则,似乎公开发布将于2015年...


1
可以尝试一些怪人一起使用gstatic.com/recaptcha/api2/r20140903161709/recaptcha__en.js如果你搜索“G-验证码”,“我不是机器人”或“复选框”你可以发现,是代码在那里实施。
伊恩M

3
电子邮件节选:We expect to move all existing reCAPTCHA sites to the new API in 2015.
Timothy Zorn 2014年

1
下面是谷歌的博客文章宣布新没有CAPTCHA验证reCAPTCHA功能: googleonlinesecurity.blogspot.com/2014/12/...
Nealvs

4
这在哪里说明新产品的No CAPTCHA reCAPTCHA工作原理?
Nikhil Girraj 2015年

5
@NikhilGirraj,如果你想知道如何不CAPTCHA验证reCAPTCHA工作,我点你这个职位
伊戈尔·萨文金

114

该条目不能回答原始问题,但是有助于实现类似的解决方案。 正如@IanM所说,复选框Recaptcha处于beta阶段,没有邀请就不能使用。

重要编辑 Google推出了新的reCAPTCHA

这是基于JavaScript的CAPTCHA。

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

请注意,根本没有复选框,它只是具有某些CSS样式的div元素。Spambots试图填充表单输入元素,但是CAPTCHA中没有输入。复选标记只是另一个div(css类)。

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

要点中的步骤:

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

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

注意只有在启用JavaScript的情况下,这种验证码才有效!

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

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

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


4
我认为问题特别是关于“如何通过Google的reCAPTCHA启用此功能?” 我非常有信心自己可以实现这一点,但是要解决这个问题并不是那么简单。
马达拉的幽灵

如果单击“街景”页面底部的“报告问题”,则会得到相同的新Recaptcha。那是我第一次看到它并在搜索时找到此SO页面的地方。
user2605793 2014年

1
什么会阻止漫游器发送该ajax请求?如果每个人(或一个半大型站点)都要实施这样的CAPTCHA,则肯定会被利用。Cloudflare有一个类似的漫游器检测系统,该系统似乎不需要用户执行任何操作即可工作。
SteenSchütt2014年

首先,我完全同意您的评论,是的,直接编写以利用一个站点的机器人将会失败(这对任何种类的capthas都是如此)。我most bots从而不是从开始all bots。还有一些解决方案,当基于图像的验证码破解者将图像简单地发送给软件并由人物输入人物时(成功的职位数将支付给受雇人员)。您将如何预防呢?:)
Pred

1
@Pred“ Spambots试图填充表单输入元素,但CAPTCHA中没有输入。” 真可悲。jackiechanface.jpg
crazypotato

9

这是我的代码在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但在客户端代码中未定义此类元素...我是否缺少某些内容?
圣母玛利亚教堂,

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.";
    }
}

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.