设为首页 收藏本站
查看: 1478|回复: 0

[经验分享] 谈谈那些年PHP中屌屌的验证码

[复制链接]

尚未签到

发表于 2015-8-22 17:21:26 | 显示全部楼层 |阅读模式
  验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码、刷票、灌水,可以有效的防止暴力破解特定用户。
  现在就来了解了解那些年PHP中屌屌的验证码吧。
  首先,以四位验证码为例(多位验证码一样的道理)。
  目前网站大多仍然采用静态图片验证码,因为这样实现起来简单又方便,不需要过硬的功底,当然这也是基础。而其原理也就是通过PHP的画图功能将文字画成图片返回到页面。因此,我们解决的问题也就只有三步而已:


  • 随机生成验证码的内容
  • 将验证码转换成图片,即绘图
  • 将所绘出的图返回到页面中
  当然,PHP默认是没有开启绘图功能的,因此,在php.ini的配置文件中先开启绘图功能吧:搜到  ;extension=php_gd2.dll  将前面的分号去掉即可。(记得保存喔!)
  那根据第一点,大家首先应该会想到数字的验证码,因为这容易,随机生成个几个数字,然后拼起来也就行了,像酱紫!


DSC0000.gif DSC0001.gif


1 $validateCode = '';
2 for ($i = 0; $i < 4; $i ++) {
3     $validateCode .= rand(0, 9);
4 }
5 echo $validateCode;
View Code  然后仔细想想,现在的网站验证码都有字母,可这玩意儿都没字母,怎么呢?然后又想到,直接把上面那玩意儿搞成十六进制就好了。





1 $validateCode = '';
2 for ($i = 0; $i < 4; $i ++) {
3     $validateCode .= dechex(rand(0, 16));
4 }  
5 echo $validateCode;
View Code  好像有点自作聪明的赶脚呀,不过想想,也算是有几个字母了,可却只有a,b,c,d,e,f,那要是需要所有字母咋办呢?哈哈,在想想也就想到把所有的字母和数字等在一个字符串中列出来,然后通过随机下标的形式去
随机获取对应的值,也就成了这样:





1 $validateCode = '';
2 $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
3 for ($i = 0; $i < 4; $i ++) {
4     $validateCode .= $str[rand(0, strlen($str))];
5 }  
6 echo $validateCode;
View Code  哈哈,终于像验证码里的随机数了,不过看到下面的方法,有总瞬间被秒的赶脚呀:



echo substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);
  str_shuffle方法将字符串内容打乱,substr($str, 0, 4)取到了前四个数。这样是完全没有问题的!不过细心的看的出来,这样的验证码里的内容是不会重复的。
  
  以上验证码也就产生了,接下来也就要将验证码用PHP画出来了。





1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);
2
3 // 创建一张宽为110px,高为25px的图片
4 $img = imagecreatetruecolor(110, 25);
5 // 将图片的背景颜色设置成黑色,颜色值分别对应RGB
6 $bgcolor = imagecolorallocate($img, 0, 0, 0);
7
8 // 创建白色
9 $white = imagecolorallocate($img, 255, 255, 255);
10
11 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
12 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
13
14 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
15 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
View Code  
  当然,这样的话验证码就太好识别了,就只是单纯的黑底白字,为了增加点难度,我们就多加几条线叠加在验证码的上面。





1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);
2
3 // 创建一张宽为110px,高为25px的图片
4 $img = imagecreatetruecolor(110, 25);
5 // 将图片的背景颜色设置成黑色,颜色值分别对应RGB
6 $bgcolor = imagecolorallocate($img, 0, 0, 0);
7 // imagefill($img, 10, 10, $bgcolor);
8
9 // 创建白色
10 $white = imagecolorallocate($img, 255, 255, 255);
11
12 for ($i = 0; $i < 30; $i ++) {
13     // 在图片上画线,其中第2个参数表示线的x起始坐标,第3个参数表示线的y起始坐标,第4个参数表示x的终止坐标,第5个参数表示y的终止坐标,第6个参数表示颜色,此处生成一个随机颜色
14     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)));
15 }
16
17 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色
18 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
19
20 // 返回成图片
21 header('Content-type: image/png');
22 imagepng($img);
View Code
  结果也就成了这样,当然,要想实现验证码,这样还是不够滴,需要通过将验证码生成的随机数存到服务器的session中,$_SESSION['validate'] = $validateCode;然后在通过客户端输入的验证码与之对比即可。PHP中屌屌的验证码也就这样实现了,当然,前面也说过了,这是最基础的代码,可以通过你的想法将其改变为实现算术的验证码,中文的验证码,或其它一些有趣的验证码,以减少其枯燥性又实现安全性。
  
  大家有没有什么其它屌屌的验证码分享与我呢?
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102718-1-1.html 上篇帖子: PHP面试题集 下篇帖子: PHP求职宝典系列——PHP Web 编程篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表