php+js实现极验,拖动滑块验证码验证表单
现在很多网站,比如淘宝,京东等都改用使用极验拖动验证码实现登录,这种方式比传统的验证码方式有更好的体验,减少用户输入的错误,也同样能起到防盗刷的功能。现在很多极验都是第三方的,也很多都是收费的。今天在这里给大家分享自己用原生php实现的一个极验的代码。用原生php的好处就是以后你要嵌套到什么框架,可以直接用核心代码,改一改就好了。
极验拖动动画图
代码文件截图
代码实现
html文件
- <!DOCTYPE html>
- <html lang="">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="x-ua-compatible" content="ie=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>极验滑块拖动验证码-码农社区-web视频分享网</title>
- <script type="text/javascript" src="tn_code.js?v=35"></script>
- <link rel="stylesheet" type="text/css" href="style.css?v=27" />
- <style type="text/css"></style>
- </head>
- <body style="text-align:center;">
- <div class="tncode" style="text-align: center;margin: 100px auto;"></div>
- <script type="text/javascript">
- $TN.onsuccess(function(){
- //验证通过
- });
- </script>
php文件:check.php
- <?php
- require_once dirname(__FILE__).'/TnCode.class.php';
- $tn = new TnCode();
- if($tn->check()){
- $_SESSION['tncode_check'] = 'ok';
- echo "ok";
- }else{
- $_SESSION['tncode_check'] = 'error';
- echo "error";
- }
- ?>
主要核心文件:TnCode.class.php
- <?php
- 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 $_fault = 3;
- function __construct(){
- //ini_set('display_errors','On');
- //
- error_reporting(0);
- if(!isset($_SESSION)){
- session_start();
- }
- }
- function make(){
- $this->_init();
- $this->_createSlide();
- $this->_createBg();
- $this->_merge();
- $this->_imgout();
- $this->_destroy();
- }
- function check($offset=''){
- 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;
- }
- private function _init(){
- $bg = mt_rand(1,$this->bg_num);
- $file_bg = dirname(__FILE__).'/bg/'.$bg.'.png';
- $this->im_fullbg = imagecreatefrompng($file_bg);
- $this->im_bg = imagecreatetruecolor($this->bg_width, $this->bg_height);
- 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);
- $_SESSION['tncode_r'] = $this->_x = mt_rand(50,$this->bg_width-$this->mark_width-1);
- $_SESSION['tncode_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
- }
- header('Content-Type: image/'.$type);
- $func = "image".$type;
- $func($this->im,null,$quality);
- }
- 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);//
- }
- 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);
- 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);
- }
- }
- ?>
代码下载地址
http://aso.39gs.com/tncode/tncode.rar
php+js实现极验,拖动滑块验证码验证表单的更多相关文章
- 对极验geetest滑块验证码图片还原算法的研究
免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...
- js验证表单大全
js验证表单大全 1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert(" ...
- 项目总结07:JS图片的上传预览和表单提交(FileReader()方法)
JS图片的上传预览和表单提交(FileReader()方法) 一开始没有搞明白下面这块代码的,今天有时间简单整理下 核心点:FileReader()方法 以下是代码(以JSP文件为例) <!DO ...
- jquery.validate.js 验证表单时,在IE当中未验证就直接提交的原因
jquery.validate.js 验证表单时,在IE当中未验证就直接提交的原因 今天利用了jquery.validate.js来验证表单,发现在火狐.谷歌浏览器当中都可以进行验证,但是在IE系列浏 ...
- JS高级---案例:验证表单
案例:验证表单 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- php+js实现极验滑块拖动验证码-tncode
先上图: 演示地址:http://aso.39gs.com/tncode/index.html 相信在淘宝,斗鱼这些大网站都见到过这样的验证码了,拖动验证码比传统在移动端有更好的化验,减少用户的输入. ...
- Django中使用极验Geetest滑动验证码
一,环境部署 1.创建一个django测试项目 此处省略... 二,文档部署 1.下载安装python对应的SDK 使用命令从Github导入完整项目:git clone https://github ...
- 利用ajax,js以及正则表达式来验证表单递交
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" ...
- js和jq使用submit方法无法提交表单
昨天,在做一个表单异步提交内容的时候,遇到很奇怪的问题,submit()方法无法进行提交,每次提交都是把 当前给刷新了,网络抓包发现,每次都是 get方式去获取 当前页面,完全没有post 请求,想着 ...
随机推荐
- java 补充(final、static)
final 固定的 final 修饰类的时候,只能作为子类继承,不能作为父类. final 定义变量时,必须给成员变量赋值.------ 1.直接赋值 2.构造方法. final 修饰成员方法时 ...
- [RN] 全国城市列表选择 (包含定位城市、热门城市、全国城市)
全国城市列表选择 (包含定位城市.热门城市.全国城市) 用ScrollView 实现,解决 SectionList 实现的卡顿问题 实现效果如图: 代码实现如图: 主逻辑文件 cityList.js ...
- tensorflow数据加载、模型训练及预测
数据集 DNN 依赖于大量的数据.可以收集或生成数据,也可以使用可用的标准数据集.TensorFlow 支持三种主要的读取数据的方法,可以在不同的数据集中使用:本教程中用来训练建立模型的一些数据集介绍 ...
- Cookie、token、session的区别是什么?
背景: 最近在总结一些容易理解混淆的概念,之前面试的时候提到过,我觉得也说不清楚,这两天项目做接口测试发现用的cookie而不是之前的token,于是总结一下,便于以后用到的时候再阅读以及分享给需要的 ...
- WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged
.Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...
- Java 集合系列之三:Set基本操作
1. Java Set 1. Java Set 重要观点 Java Set接口是Java Collections Framework的成员. Set不允许出现重复元素-----------无重复 Se ...
- Solr7.x学习(8)-使用spring-data-solr
1.maven配置 <dependency> <groupId>org.springframework.data</groupId> <artifactId& ...
- c# EPPlus读取Excel里面的时间字段时,1900-01-01转成了1899-12-31
看到一篇文章:https://bbs.csdn.net/topics/70511379,5楼的回复: 我发现EXCEL有千年虫BUG,把1900年算成闰年了,2月有29天.1900年3月1日以后就没问 ...
- Android.mk基础
1.前言 Android.mk用于向编译系统描述源文件和共享库,它实际上是编译系统解析一次或多次的微小GNU makefile片段.它的语法支持将源文件分组为模块,模块是静态库.共享库或独立的可执行文 ...
- 读懂 ECMA 规格
一般我们都不关心 ECMA 规范,只需要学习怎么使用就好了.但有时候遇到一些难以解释的问题/现象,就不得不看一下规范是如何要求实现的了.规范内容庞杂,理解其中的术语有利于我们快速看懂规范. Envir ...