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 相关文章推荐
html中select语句读取mysql表中内容
Oct 09 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
php的大小写敏感问题整理
Dec 29 PHP
PHP中数组定义的几种方法
Sep 01 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
Yii框架登录流程分析
Dec 03 PHP
php实现的mongodb操作类
May 28 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 PHP
Zend Framework数据库操作技巧总结
Feb 18 PHP
Laravel5.1 框架路由基础详解
Jan 04 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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
Pandas读取MySQL数据到DataFrame的方法
2018/07/25 Python
基于python实现聊天室程序
2018/07/27 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
反对邪教标语
2014/06/30 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
django 认证类配置实现
2021/11/11 Python