php 滑块验证码后台+小程序(或h5)

备注:

源码中是 h5 和 后端的,如果前端为小程序。无法直接使用

之前本身是验证码验证,但是要改成滑块验证

使用的框架是 yii2 源码并不是线上代码。

以下为实际代码

需要源码中的 bg 目录 img 目录 TnCode.php

源码中验证使用的是session 来校验验证码是否正确。我这边前端是小程序无法存session改用框架自带的缓存。

修改Tncode.php 类如下。。 以用户id为唯一值,验证通过后清除。

备注:

_imgout 这个方法中的 imagepng 也可以保存图片,配合控制器返回图片链接。考虑到可能会生成很多,最后还是直接输出了

<?php
namespace app\components\common;
use Yii;
/*! tncode 1.2 author:weiyingbin email:277612909@qq.com
*/
class TnCode
{
    var $im = null;
    var $im_fullbg = null;
    var $im_bg = null;
    var $im_slide = null;
    var $bg_width = 240;
    var $bg_height = 150;
    var $mark_width = 50;
    var $mark_height = 50;
    var $bg_num = 6;
    var $_x = 0;
    var $_y = 0;
    var $cache = null;
    //容错象素 越大体验越好,越小破解难道越高
    var $_fault = 3;
    function __construct(){
        //ini_set('display_errors','On');
        //
        // error_reporting(0);
        // if(!isset($_SESSION)){
        //     session_start();
        // }
        $this->cache = Yii::$app->getCache();
    }
    function make($user_id){
     
        $this->_init($user_id);
        $this->_createSlide(); //创建滑动图
        $this->_createBg(); //创建背景图
        $this->_merge(); //合并图
        $this->_imgout(); //输出图
        // $imgName = $this->_imgout();
        $this->_destroy(); //注销
        // return $imgName;
    }

    function check($offset='',$user_id=''){
        // if(!$_SESSION['tncode_r']){
        //     return false;
        // }
        // if(!$offset){
        //     $offset = $_REQUEST['tn_r'];
        // }
        // $ret = abs($_SESSION['tncode_r']-$offset)<=$this->_fault;
        // if($ret){
        //     unset($_SESSION['tncode_r']);
        // }else{
        //     $_SESSION['tncode_err']++;
        //     if($_SESSION['tncode_err']>10){//错误10次必须刷新
        //         unset($_SESSION['tncode_r']);
        //     }
        // }
        // return $ret;
        if(!$this->cache->get($user_id)){
            return false;
        }
        if(!$offset){
            return false;
        }
        $ret = abs($this->cache->get($user_id)-$offset)<=$this->_fault;
        if($ret){
            $this->cache->set($user_id,'');
        }else{
            $num = $this->cache->get($user_id.'err');
            $this->cache->set($user_id.'err',$num+1);
            if($this->cache->get($user_id.'err')>10){//错误10次必须刷新
                $this->cache->set($user_id,'');
            }
        }
        return $ret;
    }

    private function _init($user_id){
        $bg = mt_rand(1,$this->bg_num);  // 1-6随机数
        $file_bg = dirname(__FILE__).'/bg/'.$bg.'.png';
        $this->im_fullbg = imagecreatefrompng($file_bg);  //内置php 函数编辑图片
        //用于创建新的true-color图像。此函数返回给定尺寸的空白图像。
        $this->im_bg = imagecreatetruecolor($this->bg_width, $this->bg_height);
        imagecolortransparent($this->im_bg,null);
        //用于复制图像或图像的一部分
        imagecopy($this->im_bg,$this->im_fullbg,0,0,0,0,$this->bg_width, $this->bg_height);

        $this->im_slide = imagecreatetruecolor($this->mark_width, $this->bg_height);
        $this->_x = mt_rand(50,$this->bg_width-$this->mark_width-1);
        // $_SESSION['tncode_r'] = $this->_x = mt_rand(50,$this->bg_width-$this->mark_width-1);
        // $_SESSION['tncode_err'] = 0;
        $this->cache->set($user_id,$this->_x);
        $this->cache->set($user_id.'err',0);
        $this->_y = mt_rand(0,$this->bg_height-$this->mark_height-1);
    }

    private function _destroy(){
        imagedestroy($this->im);
        imagedestroy($this->im_fullbg);
        imagedestroy($this->im_bg);
        imagedestroy($this->im_slide);
    }
    private function _imgout(){
        // if(!$_GET['nowebp']&&function_exists('imagewebp')){//优先webp格式,超高压缩率
        //     $type = 'webp';
        //     $quality = 40;//图片质量 0-100
        // }else{
        //     $type = 'png';
        //     $quality = 7;//图片质量 0-9
        // }
        $type = 'png';
        $quality = 7;//图片质量 0-9
        header('Content-Type: image/'.$type);
        $func = "image".$type; //imagepng
        $func($this->im,null,$quality);
        // $name = time() . rand(1, 9999) . '.png';
        // $dir = realpath('./') . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR;
        // if (!is_dir($dir)) {
        //     mkdir($dir, 0777, true);
        // }
        // $func($this->im,$dir.$name);
        // return $name;
    }
    private function _merge(){
        $this->im = imagecreatetruecolor($this->bg_width, $this->bg_height*3);
        imagecopy($this->im, $this->im_bg,0, 0 , 0, 0, $this->bg_width, $this->bg_height);
        imagecopy($this->im, $this->im_slide,0, $this->bg_height , 0, 0, $this->mark_width, $this->bg_height);
        imagecopy($this->im, $this->im_fullbg,0, $this->bg_height*2 , 0, 0, $this->bg_width, $this->bg_height);
        imagecolortransparent($this->im, 0);//16777215
    }

    private function _createBg(){
        $file_mark = dirname(__FILE__).'/img/mark.png';
        $im = imagecreatefrompng($file_mark);
        header('Content-Type: image/png');
        //imagealphablending( $im, true);
        imagecolortransparent($im,0);//16777215
        //imagepng($im);exit;
        imagecopy($this->im_bg, $im, $this->_x, $this->_y  , 0  , 0 , $this->mark_width, $this->mark_height);
        imagedestroy($im);
    }

    private function _createSlide(){
        $file_mark = dirname(__FILE__).'/img/mark2.png';
        $img_mark = imagecreatefrompng($file_mark);//内置php 函数编辑图片
        imagecopy($this->im_slide, $this->im_fullbg,0, $this->_y , $this->_x, $this->_y, $this->mark_width, $this->mark_height);
        imagecopy($this->im_slide, $img_mark,0, $this->_y , 0, 0, $this->mark_width, $this->mark_height);
        imagecolortransparent($this->im_slide,0 );//16777215
        //header('Content-Type: image/png');
        //imagepng($this->im_slide);exit;
        imagedestroy($img_mark);
    }

}
?>

控制器调用

    //生成验证码
public function actionSlider()
    {
        $tnCode = new TnCode();
        $imgName = $tnCode->make($this->getUserId());
        // return $this->successJson($_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].'/uploads/images/'.$imgName);
    }

效果图

验证是否正确

$tn  = new TnCode();
$code_s = Yii::$app->request->post('code');
if(empty($code_s)){
   return $this->errorJson("缺少验证码");
}
if(!$tn->check($code_s,$this->getUserId())){
    return $this->errorJson("验证错误");  
}

源码在我主页,5积分下载。

https://download.csdn.net/download/qq_41646973/87368137

小程序代码:微信小程序中使用拼图滑块儿 – 反方向的钟

优化:虽然后台有10次验证的限制。但是为了保险起见多加了一层

前端滑块轨迹数据发到后台。后台取倒数第二个数据减去倒数第一个数据除以倒数第一个数据的值之后再校验验证码是否正确

代码如下 控制器

 $tn  = new TnCode();
 $code_str = Yii::$app->request->post('code');
 $code_s = explode(',',$code_str);
 if(empty($code_s) ||  count($code_s) < 30){  
      return $this->errorJson("验证失败");
 }
 $calculation =  ( ($code_s[count($code_s) -2]) - ($code_s[0]) )  /   $code_s[count($code_s) -1] ;
            
            
 if(!$tn->check($calculation,$this->getUserId())){
      return $this->errorJson("验证错误");  
 }

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 京东滑块验证码模拟登录是指通过编写PHP代码来模拟用户在京东网站登录时所遇到的滑块验证码验证过程。 首先,需要在PHP中使用curl库或者其他网络请求库来发送HTTP请求,模拟用户访问京东登录页面。在请求中包含必要的参数,如用户名和密码等。获得登录页面后,可以通过正则表达式或者其他方法提取出滑块验证码的相关信息,例如滑块图片的URL、滑块位置的坐标等。 然后,通过再次发送HTTP请求获取滑块图片,并将其保存。可以使用GD库或其他图片处理库在本地生成一张相同大小的背景图,并将滑块图片粘贴到背景图上。 接下来,需要通过OCR技术或者其他图像处理算法来识别滑块图片的位置。可能需要先对滑块图片进行降噪、二值化等预处理操作,然后使用图像识别算法找到滑块的位置。这个过程可能需要尝试不同的算法和参数来提高识别的准确度。 最后,将识别出的滑块位置信息作为参数,再次发送HTTP请求进行验证。如果验证通过,则模拟登录成功;否则需要重新进行滑块验证码的处理。 需要注意的是,京东滑块验证码的验证机制可能会不断更新和变化,所以以上方法只是一个基本的思路,具体实现可能需要根据京东的最新验证码机制进行调整和改进。此外,模拟登录有可能违反京东网站的使用规定,所以在实际应用过程中应该谨慎操作,并遵守相关法律和规定。 ### 回答2: 在使用PHP模拟京东滑块验证码登录时,我们需要以下步骤: 1. 获取登录页面:使用PHP的curl库发送GET请求,获取京东登录页面的HTML源代码。 2. 解析滑块验证码参数:从HTML源代码中解析滑块验证码的相关参数,例如:验证码图片URL、滑块位置等。 3. 下载验证码图片:使用curl库发送GET请求,下载验证码图片到本地。 4. 识别滑块拼图位置:使用图像处理库(如OpenCV)对下载的验证码图片进行处理,识别滑块拼图的位置。 5. 计算滑块移动距离:根据拼图位置计算滑块需要移动的距离。 6. 模拟滑块拖动动作:使用JavaScript动态生成一个模拟滑块滑动的脚本,并执行。 7. 处理登录验证:在第6步中,模拟滑块拖动动作后,可能需要处理滑块验证结果。可以通过检查返回的登录页面中是否包含登录成功的标志以确定是否登录成功。 8. 提交登录表单:如果登录成功的标志存在,说明滑块验证通过,我们可以使用PHP的curl库发送POST请求,提交登录表单中的用户名和密码等信息。 9. 处理登录结果:根据返回的登录结果,判断是否登录成功。如果登录成功,说明验证码模拟登录已经成功。 总之,通过以上步骤,我们可以使用PHP实现京东滑块验证码的模拟登录。这需要使用curl库获取页面,图像处理库识别验证码位置,生成JavaScript脚本模拟滑块拖动等操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值