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:部分代码参考网络资源,不过地址记不得了。这是很久之前的项目了。

    四,完成效果:

    五,总结:

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

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

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

  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/Tiancheng-Duan/p/9049019.html
Copyright © 2011-2022 走看看