PHP后端之验证码

前言:

打算写一些实际开发中遇到的东西。我这个人记性不好,觉得记下来,以后就算想找,也能找得到。

PHP,可能很长一段时间都不会使用了。所以还是留一些记录。

另外还有一些服务器架设的总结,之后整理了,会发布出来。

一,问题:

相信大家都有以下的经历:

1,上学的时候,猜解家里电脑的登陆密码。

2,忘了行李箱密码,让后凄惨地一个个试。

3,大学,一个个试学校内网的密码。

等等。

也许,你会觉得这样一个个试,很麻烦。

那就编写一个程序,来暴力猜解多好啊。

实际情况,就是有人做这样的事情,为此,黑客们还做出了各种包含常用密码字段的破解字典来提高破解速度。

所以,为了防止这种破解。人们想出了一些方法,来杜绝这种情况:

1,密码设置得没有规律性(就是不用姓名,生日什么的)(具体密码相关,以后有机会我会写一篇专门的文章)

2,限制登陆尝试次数(在一段时间内只允许登陆有限次数)

3,验证码。

其中,验证码经过这么些年的变化,有了许多的分支。从简单输入4位数字,再到顺序点击图片中文字(如12306,简直折磨人),还有现在的邮件,短信,语音等验证码(如steam,阿里云等)

其中这些验证码方式又可以按照发送方大致分为两类:一类是通过本地服务器来提供服务(如4位数字等),另一类是通过其他服务提供商来提供服务(如短信,电话等)

当然,由于验证码的流行,还有专门的服务提供商。

其实,验证码最初完全是为了杜绝机器暴力破解。而现在的验证码,如短信,完全可以确认人的身份(所以现在有的登陆完全不需要密码,只需要账号和验证码)。其价值已经大大提高了。

今天,只做一个本地服务器制作的验证码。其他的本地验证码完全可以照此类变形。

二,实现原理:

PHP支持许多的函数,其中一些函数完全可以将字符串,制作为图片。

完全可以将画布背景放上一些乱码,再挑选四个数字(你也可以添加字母,但是那样会比较花)。按照不同的角度放在画布上。

注意返回的文件格式即可。

三,实际代码:

 <?php
/**
* Created by PhpStorm.
* User: curek
* Date: 2/5/2018
* Time: 3:57
*/ //设置字符集
header("Content-Type:text/html;charset=utf-8"); //图宽
$width = 150;
//图高
$height = 40;
//验证码的长度
$length = 4;
//字体样式
$fontstyle = './font/MSYHBD.TTF';
//字体大小
$fontsize = 20; //1.创建画布
$img = imagecreatetruecolor($width, $height); //2.分配颜色
$bgcolor = imagecolorallocate($img, mt_rand(180, 240), mt_rand(180, 240), mt_rand(180, 240)); //3.填充
imagefill($img, 0, 0, $bgcolor); //4.画干扰
$str = '~~~~~~~~~~~~~~~~~~~~!@#$%%^^&*()_+.,[]:<>'; //手写一些奇葩符号
$str_len = strlen($str);
for ($i = 0; $i < $str_len; $i++) {
//分配字体颜色
$fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));
imagettftext($img, 8, mt_rand(0, 360), mt_rand(0, $width), mt_rand(0, $height), $fontcolor, $fontstyle, $str[$i]);
} //5.生成随机验证码
$code_small = range('a', 'z');
$code_big = range('A', 'Z');
$code_num = range('0', '9'); //6.合并成一个数组
$list = array_merge($code_small, $code_big, $code_num);
//7.随机打乱顺序
shuffle($list); //8.用于储存验证码
$code = '';
for ($i = 0; $i < $length; $i++) {
//分配字体颜色
//分配字体颜色
$fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));
imagettftext(
$img, //操作目标
$fontsize, //字体大小
mt_rand(-40, 40), //角度
(($i * $fontsize) + ($width - ($length + $fontsize) >> 1)), //字体横坐标X
(($height - $fontsize >> 1) + $fontsize), //字体纵坐标Y
$fontcolor, //字体颜色
$fontstyle, //字体样式
$list[$i] //字体内容
);
$code .= $list[$i];
} //9.开启会话
session_start();
//10.将正确验证码放入session
$_SESSION['code'] = $code; header('Content-Type:image/png');
imagepng($img);
imagedestroy($img);
?>

PS:需要的说明都写在了注释内。

PS2:部分代码参考网络资源,不过地址记不得了。这是很久之前的项目了。

四,完成效果:

五,总结:

其他的诸如短信验证等,代码都比较简单,而且服务提供商都有教程。所以不在此赘述。

验证码用到的地方还是很多的。我们应该学会并理解原理。

起码看到别人家网站上的验证码,能够知道它的运行原理。

PHP后端之验证码的更多相关文章

  1. 用Canvas生成随机验证码(后端前端都可以)

    一 .使用前端生成验证码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  3. web系统登陆页面增加验证码

    传统登陆页面中包含两个输入项: • 用户名 • 密码有时为了防止机器人进行自动登陆操作,或者防止恶意用户进行用户信息扫描,需增加动态验证码功能.此时,登陆页面中包含了三个输入项: • 用户名 • 密码 ...

  4. MVC伪一个12306图片验证码

    本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...

  5. 登录验证码demo-java

    在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码.这里把我自己写的一个小系统(后台是java语言)的验证码部分摘出来. 总体思路是后端有一个生成验证码图片的接口,把验证码图片写入浏览器, ...

  6. vue_drf之实现极验滑动验证码

    一.需求 1,场景 我们在很多登录和注册场景里,为了避免某些恶意攻击程序,我们会添加一些验证码,也就是行为验证,让我们相信现在是一个人在交互,而不是一段爬虫程序.现在市面上用的比较多的,比较流行的是极 ...

  7. Django学习手册 - 登录验证码

    生成验证码函数 import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = " ...

  8. vue 项目,获取手机验证码和图形验证码(iviewUI框架)

    1.编辑获取验证码模块 <Form ref="phoneFormItem" :model="phoneFormItem" :label-width=&qu ...

  9. koa2实现简单的验证码

    //首先引入svg-captcha,https://www.npmjs.com/package/svg-captcha const svgCaptcha = require('svg-captcha) ...

随机推荐

  1. javascript概要学习

    Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为 ...

  2. 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现

    1 编写以下案例: 当点击了"播放"之后,在手机上的/mnt/sdcard2/natural.mp3就会播放. 2 编写布局文件activity_main.xml <Line ...

  3. 在FFMPEG中使用libRTMP的经验

    FFMPEG在编译的时候可以选择支持RTMP的类库libRTMP.这样ffmpeg就可以支持rtmp://, rtmpt://, rtmpe://, rtmpte://,以及 rtmps://协议了. ...

  4. kettle 的表输出 table output

    kettle的表输出: 双击后,看设置, 1,在connecttion后面,点击new里新建一个.设定各个选项值,如选择mysql类型,则配置hostname,database name,端口, 用户 ...

  5. obj-c中-fobjc-arc-exceptions的解释

    在开启ARC之后正常情况下一切和内存有关的申请和释放操作皆不用你关心了,ARC全全帮你包办了.但是还有极少数的情况下,编译器无法为你生成合适的ARC额外代码,比如obj-c异常就是这么一个例子. 话句 ...

  6. ViewPagerIndicator+viewpager指示器详解

    前几天学习了ViewPager作为引导页和Tab的使用方法.后来也有根据不同的使用情况改用Fragment作为Tab的情况,以及ViewPager结合FragmentPagerAdapter的使用.今 ...

  7. 初探linux子系统集之led子系统(二)

    巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...

  8. objective-c中类似ruby枚举类的实例方法

    虽然obj-c的语法格式略显繁琐,但它和ruby都从某些方面继承了smalltalk的某些动态的东西.这些东西是 C和C++之类的静态语言所不曾有的. 比如ruby中可以将一个类或对象的所有方法枚举出 ...

  9. IOS常见的加密方法,常用的MD5和Base64

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  10. LeetCode(47)-Reverse Bits

    题目: Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented ...