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 相关文章推荐
php笔记之常用文件操作
Oct 12 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
php session的锁和并发
Jan 22 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 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实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
php封装的smarty类完整实例
2016/10/19 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
javascript 数组排序函数
2009/08/20 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
Python中zfill()方法的使用教程
2015/05/20 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
后备干部培训方案
2014/05/22 职场文书
个人委托书如何写
2014/09/25 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技