thinkphp整合系列之极验滑动验证码geetest功能


Posted in PHP onJune 18, 2019

给一个央企做官网,登录模块用的thinkphp验证码类。但是2019-6-10到12号,国家要求央企检验官网漏洞,防止黑客攻击,正直贸易战激烈升级时期,所以各事业单位很重视官网安全性,于是乎集团总部就委托了宁波一个专业检测公司用专业工具检测出,后台验证码能用打码工具暴力破解,发函要求整改。so,就有了下面的极速验证图形

thinkphp整合系列之极验滑动验证码geetest功能

thinkphp整合系列之极验滑动验证码geetest功能

官网:http://www.geetest.com/

一:注册获取key

注册;创建应用;获取key;

thinkphp整合系列之极验滑动验证码geetest功能

thinkphp整合系列之极验滑动验证码geetest功能

二:导入sdk

/ThinkPHP/Library/Org/Xb/GeetestLip.class.php(此处GeetestLip.class.php是我重新命名的geetest类文件,原名为class.geetestlib.php)

thinkphp整合系列之极验滑动验证码geetest功能

此处牵扯到thinkphp引入第三方类,我把第三方类放到Org/Util/Xb下面了,同时对该类文件加入命名空间如下,否则实例化类时找不到文件

thinkphp整合系列之极验滑动验证码geetest功能

三:生成验证样式

admin/view/public/cdtsh_log_smfyws.php

<meta charset="GBK" />
<title></title>
<script language="javascript" type="text/javascript" src="__JS__/jquery.js"></script>
<link href="__CSS__/jquery.validator.css" rel="stylesheet" /><script type="text/javascript" src="__JS__/jquery.validator.js"></script><script type="text/javascript" src="__JS__/zh_CN.js"></script>
<link href="__CSS__/admin_login.css?v20130227" rel="stylesheet" /><script>
    $(document).ready(function(){
      var verifyimg = $(".verifyimg").attr("src");
      $(".reloadverify").click(function(){
        if( verifyimg.indexOf('?')>0){
          $(".verifyimg").attr("src", verifyimg+'&random='+Math.random());
        }else{
          $(".verifyimg").attr("src", verifyimg.replace(/\?.*$/,'')+'?'+Math.random());
        }
      });
    });
  </script>
<div class="wrap">
<h1><a href="javascript:;" style="height: 116px; width: 250px;">后台管理中心</a></h1>

<form action="{:U('Admin/Public/cdtsh_log_smfyws')}" method="post">
<div class="login">
<ul>
	<li><input class="input" data-rule="required;username" id="username" name="username" placeholder="用户名" title="用户名" type="text" /></li>
	<li><input class="input" data-rule="required;password" name="password" placeholder="密码" title="密码" type="password" /></li>
	<li><input class="input" data-ok=" " data-rule="required;text;remote[{:U('Admin/Public/check_verify')}]" data-tip="输入验证码!" id="verify" name="verify" placeholder="验证码" style="width:130px;" title="密码" type="text" />
	<div class="yanzhengma_box" id="verifyshow"><img align="right" class="verifyimg reloadverify" src="{:U('public/verify')}" style=" cursor: pointer;" title="点击刷新" /></div>
	</li>
</ul>

<div id="captcha">&nbsp;</div>

<ul><input type="button" value="异步验证登录" onclick="check_verify()"><input type="submit" value="post提交登录">
</ul>
<button class="btn" id="subbtn" type="submit">登录</button></div>
</form>
</div>
<script src="http://static.geetest.com/static/tools/gt.js"></script><script>
  var handler = function (captchaObj) {
    // 将验证码加到id为captcha的元素里
    captchaObj.appendTo("#captcha");
   };
  // 获取验证码
  $.get("{:U('Admin/Public/verifys')}", function(data) {
    // 使用initGeetest接口
    // 参数1:配置参数,与创建Geetest实例时接受的参数一致
    // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
    initGeetest({
      gt: data.gt,
      challenge: data.challenge,
      product: "float", // 产品形式
      offline: !data.success,
      new_captcha:'true',
      width:'260px',
    }, handler);
  },'json');
</script>

四:验证函数

/Application/Common/Common/function.php

/**
 * geetest检测验证码
 */
function geetest_chcek_verify($data){
  $geetest_id = "7149e2021d7938157e";
  $geetest_key = "62b92039e1e9cf9455";
  $geetest=new \Org\Util\Xb\GeetestLib($geetest_id,$geetest_key);
  $user_id=$_SESSION['geetest']['user_id'];
  $ip_address=$_SESSION['geetest']['ip_address'];
  $dataa = array(
    "user_id" => $user_id, # 网站用户id
    "client_type" => "web", #web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式
    "ip_address" => $ip_address, # 请在此处传输用户请求验证时所携带的IP
  );
  if ($_SESSION['geetest']['gtserver']==1){
    $result=$geetest->success_validate($data['geetest_challenge'], $data['geetest_validate'], $data['geetest_seccode'], $dataa);
    //return $result;
    if ($result) {
      //return 11;
      return true;
    } else{
      //return 22;
      return false;
    }
  }else{
    if ($geetest->fail_validate($data['geetest_challenge'],$data['geetest_validate'],$data['geetest_seccode'])) {
      //return 33;
      return true;  
    }else{
      //return 44;
      return false;
    }
  }
}
//获取id地址
function GetIP() {
  if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
    $cip = $_SERVER["HTTP_CLIENT_IP"];
  } elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  } elseif (!empty($_SERVER["REMOTE_ADDR"])) {
    $cip = $_SERVER["REMOTE_ADDR"];
  } else {
    $cip = "无法获取!";
  }
  return $cip;
}

五:php 生成验证码 并 验证

//极速验证
  public function verifys(){
    //require_once dirname(dirname(dirname(__FILE__))) . '/lib/class.geetestlib.php';
    //require_once dirname(dirname(__FILE__)) . '/config/config.php';
    // $GtSdk = new GeetestLib(CAPTCHA_ID, PRIVATE_KEY);
    $geetest_id = "7149e2021d7938157e9";
    $geetest_key = "62b92039e1e9cf";
    $geetest=new \Org\Util\Xb\GeetestLib($geetest_id,$geetest_key);
    //dump($geetest);die;
    $user_id = "test";
    $data = array(
      "user_id" => $user_id, # 网站用户id
      "client_type" => "web", #web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式
      "ip_address" => GetIP(), # 请在此处传输用户请求验证时所携带的IP
    );
    $status = $geetest->pre_process($data,1);
    //dump($status);
    $_SESSION['geetest']=array(
      'gtserver'=>$status,
      'user_id'=>$user_id,
      'ip_address'=>GetIP(),
      );
    echo $geetest->get_response_str();
  }
 public function cdtsh_log_smfyws() {
    if ($_SESSION['userid']) {
      $this->redirect('Admin/Index/Index');
    } else {
      if (IS_POST) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        //$geetest_challenge = $_POST['geetest_challenge'];
        //$geetest_validate = $_POST['geetest_validate'];
        //$geetest_seccode = $_POST['geetest_seccode'];
        $data=I('post.');
        if($data['geetest_challenge']=="" || $data['geetest_validate']=="" ||$data['geetest_seccode']=="" ){
          $this->error('请进行图形验证');
        }else{
          //dump(geetest_chcek_verify($data));
          if (geetest_chcek_verify($data)){
            //echo '验证成功';
            if ($this->loginAdmin($username, $password)) {
              $data = M("User")->where("username='".$username."' and password='".md5($password)."'")->find();
              if ($data["status"] != 1) {
                //判断是否禁用
                $this->recordLoginAdmin($_POST['username'], $_POST['password'], 0, "账号禁用"); //记录登录日志
                $this->error('该帐号禁用');
              } else {
                $save["lastlogin_time"] = time();
                $save["lastlogin_ip"] = get_client_ip();
                $save["login_num"] = $data["login_num"] + 1;
                $status = M("user")->where(array("id" => $data['id']))->save($save);
                $_SESSION['userid'] = $data['id'];
                $_SESSION['user'] = $data['username'];
                $_SESSION['rid'] = $data['a_Id'];
                $this->recordLoginAdmin($_POST['username'], $_POST['password'], 1); //记录登录日志
                $this->redirect('Admin/Index/Index');
                //$this->success('登录成功',U('Admin/Index/Index'));
              }
            } else {
              $this->recordLoginAdmin($_POST['username'], $_POST['password'], 0, "账号密码错误"); //记录登录日志
              $this->error('登录失败');
            }
          }else{
            //echo '图形验证失败';
            $this->error('图形验证失败');
          }
        }
      } else {
        $this->display();
      }
    }
  }

到这里就结束了

总结

以上所述是小编给大家介绍的thinkphp整合系列之极验滑动验证码geetest功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
cmd下运行php脚本
Nov 25 PHP
php中利用post传递字符串重定向的实现代码
Apr 21 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
php遍历数组的方法分享
Mar 22 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 #PHP
php设计模式之装饰模式应用案例详解
Jun 17 #PHP
php设计模式之策略模式应用案例详解
Jun 17 #PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 #PHP
PHP 并发场景的几种解决方案
Jun 14 #PHP
PHP 实现文件压缩解压操作的方法
Jun 14 #PHP
php反射学习之依赖注入示例
Jun 14 #PHP
You might like
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
详解Vue 换肤方案验证
2019/08/28 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
12岁生日感言
2014/01/21 职场文书
房地产促销活动方案
2014/03/01 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
职工代表大会主持词
2014/04/01 职场文书
应聘教师自荐书
2014/06/16 职场文书
早读课迟到检讨书
2014/09/25 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
科技活动总结范文
2015/05/11 职场文书
2015年党总支工作总结
2015/05/25 职场文书