zoukankan      html  css  js  c++  java
  • PHP后端之验证码

    PHP后端之验证码

    前言:

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

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

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

    一,问题:

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

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

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

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

    等等。

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

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

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

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

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

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

    3,验证码。

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

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

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

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

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

    二,实现原理:

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

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

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

    三,实际代码:

     1 <?php
     2 /**
     3  * Created by PhpStorm.
     4  * User: curek
     5  * Date: 2/5/2018
     6  * Time: 3:57
     7  */
     8 
     9 //设置字符集
    10 header("Content-Type:text/html;charset=utf-8");
    11 
    12 //图宽
    13 $width = 150;
    14 //图高
    15 $height = 40;
    16 //验证码的长度
    17 $length = 4;
    18 //字体样式
    19 $fontstyle = './font/MSYHBD.TTF';
    20 //字体大小
    21 $fontsize = 20;
    22 
    23 //1.创建画布
    24 $img = imagecreatetruecolor($width, $height);
    25 
    26 //2.分配颜色
    27 $bgcolor = imagecolorallocate($img, mt_rand(180, 240), mt_rand(180, 240), mt_rand(180, 240));
    28 
    29 //3.填充
    30 imagefill($img, 0, 0, $bgcolor);
    31 
    32 
    33 //4.画干扰
    34 $str = '~~~~~~~~~~~~~~~~~~~~!@#$%%^^&*()_+.,[]:<>';   //手写一些奇葩符号
    35 $str_len = strlen($str);
    36 for ($i = 0; $i < $str_len; $i++) {
    37     //分配字体颜色
    38     $fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));
    39     imagettftext($img, 8, mt_rand(0, 360), mt_rand(0, $width), mt_rand(0, $height), $fontcolor, $fontstyle, $str[$i]);
    40 }
    41 
    42 
    43 //5.生成随机验证码
    44 $code_small = range('a', 'z');
    45 $code_big = range('A', 'Z');
    46 $code_num = range('0', '9');
    47 
    48 //6.合并成一个数组
    49 $list = array_merge($code_small, $code_big, $code_num);
    50 //7.随机打乱顺序
    51 shuffle($list);
    52 
    53 //8.用于储存验证码
    54 $code = '';
    55 for ($i = 0; $i < $length; $i++) {
    56     //分配字体颜色
    57     //分配字体颜色
    58     $fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));
    59     imagettftext(
    60         $img,   //操作目标
    61         $fontsize,  //字体大小
    62         mt_rand(-40, 40), //角度
    63         (($i * $fontsize) + ($width - ($length + $fontsize) >> 1)),   //字体横坐标X
    64         (($height - $fontsize >> 1) + $fontsize), //字体纵坐标Y
    65         $fontcolor, //字体颜色
    66         $fontstyle, //字体样式
    67         $list[$i]   //字体内容
    68     );
    69     $code .= $list[$i];
    70 }
    71 
    72 //9.开启会话
    73 session_start();
    74 //10.将正确验证码放入session
    75 $_SESSION['code'] = $code;
    76 
    77 header('Content-Type:image/png');
    78 imagepng($img);
    79 imagedestroy($img);
    80 ?>

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

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

    四,完成效果:

    五,总结:

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

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

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

  • 相关阅读:
    Android中AsyncTask与handler
    AndroidTimer使用(三)补充篇
    Android的消息机制(一)
    Android消息处理机制(二)
    java操作Excel文件(二)
    java操作excel
    Android APK反编译详解(附图)
    Android中Handler的使用方法——在子线程中更新界面
    Android线程间通信的Message机制
    AndroidTimer使用(二)
  • 原文地址:https://www.cnblogs.com/Tiancheng-Duan/p/9049019.html
Copyright © 2011-2022 走看看