使用Google reCAPTCHA防止机器注册

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_jian/article/details/84191095

本文作者:陈进坚
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:[email protected]

环境要求

  • 能翻墙的电脑
  • 域名

验证原理

在谷歌recaptcha申请验证密钥,配置好服务器的域名,在需要验证的表单中嵌入google reCAPTCHA ,提交表单的时候将验证成功生成的响应码传给后台,后台将响应码post到谷歌的服务器验证地址,谷歌服务器将返回验证结果。生成响应码的页面域名必须是在谷歌页面配置的域名才能生成,只有ip也不行。google reCAPTCHA在web端有3种形式的验证

1.reCAPTCHA v3

在网页加载的时候生成响应码,不需要用户进行任何操作。生成响应码的时候会稍有延迟,比网页加载完成会慢一点,确保了他人利用程序获取html代码的方式不会获取响应码。加入reCAPTCHA v3 的页面会有类似下面的图标

2.reCAPTCHA v2 Checkbox 点击复选框

用户点击复选框进行验证成功后生成响应码,图标如下

3.reCAPTCHA v2 Invisible 自定义按钮

开发人员自定义验证的动作,验证成功后调用生成响应码的js代码生成响应码即可。图标与第1种相同。

申请密钥

打开网页 https://www.google.com/recaptcha/admin 登录谷歌账号,在Label下面的输入项目名,然后选择reCAPTCHA的类型,点击Register即可注册完成,完成后可以得到Site key和Secret key。

配置域名

在上一步注册好之后的页面底下Domains的框中输入需要验证的域名,只有输入的域名网站才有资格生成你的响应码。

插入前端代码

在申请密钥完成的页面中按照给出的步骤Step1加入前端代码,比如如果是v3类型的验证码:

在html头部引入js

<script src='https://www.google.com/recaptcha/api.js?render=你的Site key'></script>

由于国家防火墙的原因,大陆的网站需要将js替换为国内的js地址(js是在客户端浏览器执行的,服务器能翻墙也不行)

https://www.recaptcha.net/recaptcha/api.js

生成响应码

<script>
grecaptcha.ready(function() {

	grecaptcha.execute('你的Site key', {action: 'action_name'})

.then(function(token) {

// 将这个生成的token传给后台

	});

});
</script>

后台验证

将前端传过来的响应码和你的Secret key发送到谷歌验证地址进行验证,判断返回数据即可

大陆的需要将验证链接 https://www.google.com/recaptcha/api/siteverify 改为 https://www.recaptcha.net/recaptcha/api/siteverify

php示例:

<?php
function send_post($url, $post_data)
{
    $postdata = http_build_query($post_data);
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-type:application/x-www-form-urlencoded',
            'content' => $postdata,
            'timeout' => 15 * 60 // 超时时间(单位:s)
        )
    );
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    return $result;
}
		    
$post_data = array(        
	'secret' => '你的Secret key',        
	'response' => $_POST["g-recaptcha-response"]    //前端传过来的响应码
);

$recaptcha_json_result = send_post('https://www.google.com/recaptcha/api/siteverify', $post_data); 
$recaptcha_result = json_decode($recaptcha_json_result);   
//在这里处理返回的值 
var_dump($recaptcha_result);    
?>

隐藏reCAPTCHA图标

根据reCAPTCHA的服务条款(即你必须同意),您必须告知游客有关网站上的验证码实现

但是有时候在手机页面这么大的一个图标确实会影响到页面效果,不得不隐藏的时候可以在前端做一下处理

  • 设置data-badge属性inline

    <button type="submit" data-sitekey="your_site_key" data-callback="onSubmit" data-badge="inline" /> 
    
  • 添加CSS

    .grecaptcha-badge { 
        display: none; 
    } 
    

猜你喜欢

转载自blog.csdn.net/C_jian/article/details/84191095