验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码、刷票、灌水,可以有效的防止暴力破解特定用户。

  现在就来了解了解那些年PHP中屌屌的验证码吧。

  首先,以四位验证码为例(多位验证码一样的道理)。

  目前网站大多仍然采用静态图片验证码,因为这样实现起来简单又方便,不需要过硬的功底,当然这也是基础。而其原理也就是通过PHP的画图功能将文字画成图片返回到页面。因此,我们解决的问题也就只有三步而已:

  1. 随机生成验证码的内容
  2. 将验证码转换成图片,即绘图
  3. 将所绘出的图返回到页面中

  当然,PHP默认是没有开启绘图功能的,因此,在php.ini的配置文件中先开启绘图功能吧:搜到  ;extension=php_gd2.dll  将前面的分号去掉即可。(记得保存喔!)

  那根据第一点,大家首先应该会想到数字的验证码,因为这容易,随机生成个几个数字,然后拼起来也就行了,像酱紫!

 $validateCode = '';
for ($i = 0; $i < 4; $i ++) {
$validateCode .= rand(0, 9);
}
echo $validateCode;

  然后仔细想想,现在的网站验证码都有字母,可这玩意儿都没字母,怎么呢?然后又想到,直接把上面那玩意儿搞成十六进制就好了。

 $validateCode = '';
for ($i = 0; $i < 4; $i ++) {
$validateCode .= dechex(rand(0, 16));
}
echo $validateCode;

  好像有点自作聪明的赶脚呀,不过想想,也算是有几个字母了,可却只有a,b,c,d,e,f,那要是需要所有字母咋办呢?哈哈,在想想也就想到把所有的字母和数字等在一个字符串中列出来,然后通过随机下标的形式去
随机获取对应的值,也就成了这样:

 $validateCode = '';
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
for ($i = 0; $i < 4; $i ++) {
$validateCode .= $str[rand(0, strlen($str))];
}
echo $validateCode;

  哈哈,终于像验证码里的随机数了,不过看到下面的方法,有总瞬间被秒的赶脚呀:

echo substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);

  str_shuffle方法将字符串内容打乱,substr($str, 0, 4)取到了前四个数。这样是完全没有问题的!不过细心的看的出来,这样的验证码里的内容是不会重复的。

  以上验证码也就产生了,接下来也就要将验证码用PHP画出来了。

 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);

 // 创建一张宽为110px,高为25px的图片
$img = imagecreatetruecolor(110, 25);
// 将图片的背景颜色设置成黑色,颜色值分别对应RGB
$bgcolor = imagecolorallocate($img, 0, 0, 0); // 创建白色
$white = imagecolorallocate($img, 255, 255, 255); // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAAAWCAIAAACuSD4AAAAAd0lEQVRYhe3WMQ6AIBBE0bn/pbGgEBTWlWhB5r9KzVY/S1ACAADA1kopwWv9UiXnfbWZNEkzG6BjZzmlacf2kA7bxYGCeTv3UpeHVyl9OyqRUuG6kfL0bcrZmIVMSvUb93hrm9b8I6U8ayZTalQ2/id3rAkA2N4BAzAECyzKuggAAAAASUVORK5CYII=" alt="" />  

  当然,这样的话验证码就太好识别了,就只是单纯的黑底白字,为了增加点难度,我们就多加几条线叠加在验证码的上面。

 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);

 // 创建一张宽为110px,高为25px的图片
$img = imagecreatetruecolor(110, 25);
// 将图片的背景颜色设置成黑色,颜色值分别对应RGB
$bgcolor = imagecolorallocate($img, 0, 0, 0);
// imagefill($img, 10, 10, $bgcolor); // 创建白色
$white = imagecolorallocate($img, 255, 255, 255); for ($i = 0; $i < 30; $i ++) {
// 在图片上画线,其中第2个参数表示线的x起始坐标,第3个参数表示线的y起始坐标,第4个参数表示x的终止坐标,第5个参数表示y的终止坐标,第6个参数表示颜色,此处生成一个随机颜色
imageline($img, rand(0, 110), rand(0, 50), rand(0, 110), rand(0, 50), imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)));
} // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); // 返回成图片
header('Content-type: image/png');
imagepng($img);

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAAAbCAIAAAAS1i3eAAADlUlEQVRoge2YP0/jMBjG3RXdiJBOHewkoixlYYWliAoWdIKP0OVG1AGmmxC6rcvRjYmVT9Chw0nolnyGbqy3VKxIveERj97aieP8O0DiUVS5jv/+8ry2E6U+ta7ZvGfl7Paf32QkH1sWx93+8yfHKpIcQyD+Nn9bHtGHFVCGO7FdlI+dnRZbb1Ozea9UOEuOX3qm4dF8XI4S4iTdm6R7hVVaRJnJcbv/q+bV5BCzBIjAFwgR+t8o66v+w8h7HoTonn4KZa2SdVEO0i7T7zm0V6vVarWS6d3+MzNn8x7Tbsm8zOYtCZrj24cG2mpNmD+C1wIEP74xyuHxwfD4YJB23zNHiQ/hXIFaKyi/TQ+tHAD1VLm/uLq/uCrdUw25G0g4IKTdhKUGFkoX5fj2YZB2AdTDFEBbYto5G3v2XzpRSpVHKdPNo2Roc/+pw/Tnn++83LuTH0tca5kOvs7ZmBePii5KudWoLFj+uw2jfOzsyFVS7uYqOPDzfCqxWnBDDoDyvN05G2P+4FvoSv9f6xZUDuXi675aR2ntNhZKqNCkSjCl7yzrQcTnca7KeX22Jm9hdelkorw7Ob07OXULl7akhdKyJJRJE7KASmoE5/rUb0DLtoGvz9Zp/Gg5PFoO1frKYFUBRP6tG90SZSZHlY+SyEJMWuEFjhD9q60SHEEQEPMEghKiyvoUVAXl5vRmc3qTxxECzUzTSblMM/EV7vulPuSAYyFB5dhQqhmUSADo5vSGtyS1Qdp92dp42doIaXOS7gFooQFdoGU/bh8th7N5r4INLTWGEpYENTKVWNWrMT1AXQOGBD5VCiID2f/BopAg1QxKcHRP6cqxKhdN0gxcAf1AK0BEOo9jng1HTwvrQn7mN/OKrsxDSUmmABce75Rr0nCIIHh5fX55fY6cTI4uLBecq9KWHB1uu5mLr/vYbfwo1StBK/wrAFVlAp/4CJFcZvNeOCy/qkT36HBbAn3s7PhRuvErD0ZkWg2oygn80dNC4suERUuGr4Z5CoruJEmiKOJvkiRxHBtj4jiOoiiOYySQxi/KRFGktY5ehRa01shEGdZFRTQr+0IxrTUL4xcl0RQSWmtjjDGGnaJB+dfqkaNCC+iLA0uShP2iO7TPETLB0eIuq8v24zhWsibSnB5nyylZaORwOUSJng1ad+MsybHykXB48gnJNgmdLYOvbFA+dYlSTsEyirzLh8HxG2OQz4601v8AyNFY5f3+nDsAAAAASUVORK5CYII=" alt="" />

  结果也就成了这样,当然,要想实现验证码,这样还是不够滴,需要通过将验证码生成的随机数存到服务器的session中,$_SESSION['validate'] = $validateCode;然后在通过客户端输入的验证码与之对比即可。PHP中屌屌的验证码也就这样实现了,当然,前面也说过了,这是最基础的代码,可以通过你的想法将其改变为实现算术的验证码,中文的验证码,或其它一些有趣的验证码,以减少其枯燥性又实现安全性。

  大家有没有什么其它屌屌的验证码分享与我呢?

谈谈那些年PHP中屌屌的验证码的更多相关文章

  1. C++屌屌的观察者模式-同步回调和异步回调

    目录 一.概述 1.同步观察者 2.异步观察者 二.效果展示 三.同步观察者 四.异步观察者 五.相关文章 原文链接:C++屌屌的观察者模式-同步回调和异步回调 一.概述 说起观察者模式,也是比较简单 ...

  2. 谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...

  3. 访何红辉:谈谈Android源码中的设计模式

    最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...

  4. [转]谈谈关于MVP模式中V-P交互问题

    在差不多两年的时间内,我们项目组几十来号人都扑在一个项目上面.这是一个基于微软SCSF(Smart Client Software Factory)的项目,客户端是墨尔本一家事业单位.前两周,我奉命负 ...

  5. 解决Yii2中刷新网页时验证码不刷新的问题

    解决Yii2中刷新网页时验证码不刷新的问题 [ 2.0 版本 ] ljfrocky  2015-05-30 19:39:00  1304次浏览 5条评论 10110 在Yii2框架中,如果在表单中使用 ...

  6. vue中使用极验验证码(附demo)

    前言: vue中使用极验验证码,最好是在页面渲染的时候(mounted)进行验证码的初始化,然后在初始化回调中绑定触发弹出验证码的事件.这样在点击按钮或者进行特定操作时能够快速的弹出验证码. 关键代码 ...

  7. 谈谈如何在面试中发掘程序猿的核心竞争力zz

    早两天看了知乎日报的这篇文章<什么是程序员的核心竞争力?>,caoz讲的几点是让我感同身受.这让我联想起了给程序猿的面试,其实也就是通过短暂的接触来发掘程序猿的核心竞争力.接下来我就谈谈我 ...

  8. 谈谈ASP.NET Core中的ResponseCaching

    前言 前面的博客谈的大多数都是针对数据的缓存,今天我们来换换口味.来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存 ...

  9. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

随机推荐

  1. 2014.06.14 GlusterFS技术交流视频

    6月14线下GlusterFS视频交流.高清视频是非常好的,我初听言论方面,谈到迅速,似乎不是很清楚,讲座结束后速度需要改进.谢谢能力的天空AbleSky高大内设,谢谢学生参加. 在线公开课:http ...

  2. osx下一个MobileBackups简介

    自从开启了mac的TimeMachine之后,使用了一段时间的mac磁盘空间降低的非常多,于是使用du -d1(disk usage and depth is one)命令查看/文件夹空间的使用情况, ...

  3. JavaScript运行命令

    前言 动人js一段时间,我认为事情仅仅是一个很肤浅的理解.是非常欠缺的.所以開始使用博客来对这一部分的知识做个慢慢的记录和积累. 相信积少成多,慢慢的将这一部分的知识攻克! 第一篇记录的不是相关的应用 ...

  4. Java高效读取大文件(转)

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读 ...

  5. linux+win7双系统重装win7修复grub的办法(转)

    本人是debian+win7的双系统, 下面介绍下重装win7的整个过程以及遇到的一些小问题,在查阅相关博客和朋友的帮助下成功修复, 记录下以便以后有不时之需, 也希望能帮助到遇到同样问题的朋友! 首 ...

  6. Ajax实践之用户是否存在

    关于Ajax在之前的学习中,已经对它的基础知识有了初步的了解.仅仅是欠实践. 那么接下来就让实践来检验一下真理吧! 基础见:http://blog.csdn.net/liu_yujie2011com/ ...

  7. 【MongoDB】在windows平台mongodb切片集群(三)

    在过去的两年我们博客详细阐述了零碎工作集群和打造过程.在这篇博客中,我们主要分析测试结果一起支离破碎集群. 首先来看看碎片集群的每个状态.你可以看出来复制集A和B都是正常的: 一.开启分片集合 开启一 ...

  8. IOS计划 分析

    1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...

  9. E - Speed Limit(2.1.1)

    E - Speed Limit(2.1.1) Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I ...

  10. BZOJ 1801 AHOI2009 中国象棋 递归

    标题效果:给定一个棋盘.放置一些枪.它需要随机两支枪不能互相攻击,评估的数目p模值 首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪 直形压力DP话是50分 考虑到每个列是等效 然后我们就可以 ...