通过验证码可以防止一些机器人和程序自动化的操作,如发送垃圾信息等。
验证码还可以防止暴力破解攻击,特别是在登录或密码重置等敏感操作时。
通过添加验证码,也可以增加攻击的难度和时间,从而减少攻击成功的可能性。
国内大厂的验证码都是收费的,之前腾讯有免费的防水墙(验证码)服务,现在也停了。
国际大厂免费的验证码服务,谷歌算是比较有名气的了。
我们这边选择的是 reCaptcha V2 版本的。
在系统集成之前,你需要先去谷歌官网申请 reCaptcha 的帐号密钥。
因为网络因素,这个是无法直接访问的,请大家参考网上的申请教程。
我们这里只介绍在CodeIgniter4系统中集成的方法。
首先,在 App\Config\App.php 中增加 密钥的配置设置。
/**
* 谷歌验证码配置
* reCaptcha V2
*/
public $reCaptchaV2 = ['htmlkey' => "***这里是网页端的密钥======",
"apikey" => "=======这里是后端api的密钥====="
];
* 谷歌验证码配置
* reCaptcha V2
*/
public $reCaptchaV2 = ['htmlkey' => "***这里是网页端的密钥======",
"apikey" => "=======这里是后端api的密钥====="
];
然后,增加两个辅助函数,辅助函数可以写到 App\Common.php 中。
第一个辅助函数,是在网页中显示验证码组件。
注意这里引用的js脚本路径,这个路径是可以在国内正常使用的。
第二个辅助函数,php后端检查验证码正确性的。
注意这里引用的js脚本路径,这个路径是可以在国内正常使用的。
[复制到剪贴板] |
function form_verifycode(string $name="validatecode"){
//获取扩展配置
$cfg = config('App');
$key =$cfg->reCaptchaV2['htmlkey'];
$txt = '<script src="https://www.recaptcha.net/recaptcha/api.js" async="" defer=""></script>';
$txt .= '<script type="text/javascript">';
$txt .= "var verifyCallback_$name = function(response) {" ;
$txt .= "document.getElementById(\"$name\").value = response;";
$txt .= "};</script>";
$txt .= "<div class=\"g-recaptcha\" data-callback=\"verifyCallback_$name\" data-sitekey=\"$key\"></div>";
$txt .= "<input type=\"hidden\" name=\"$name\" id=\"$name\">";
return $txt;
}
第二个辅助函数,php后端检查验证码正确性的。
[复制到剪贴板] |
function verify_Code(string $code){
if(empty($code))
return false;
//获取扩展配置
$cfg = config('App');
//使用方法
$post_data = array(
'secret' => $cfg->reCaptchaV2['apikey'],
'response' => $code
);
$data = post_curls('https://www.recaptcha.net/recaptcha/api/siteverify', $post_data);
$vd = json_decode($data, true);
if( empty($vd['success']) ) {
return false;
}
return true;
}