本人实测可用的简单PHP图形验证码源码
本人乃PHP的入门学生,现仅仅是把自己的学习与应用PHP的点滴记录抄写下来,加深巩固记忆。
首先谈谈为什么会有验证码这个东东,就是因为怕机器人重复劳动,所以设一道坎。其实现在也已经有很多直接分辨验证码再自动输入的机器人,所谓“道高一尺,魔高一丈”,也不可能全防御得住的,今天这个更加算是幼儿园的角色,绝对是防君子不防小人的。之前搜索过一下,看过另外一个示例是用ajax来校验,通过后用js的自定义函数go()来走下一步,就更加没难度了,别人直接运行go()这个函数就行了,可以直接跳过校验码的检测。今天介绍的起码是用php来校验和判断,不能通过分析可看到的源代码来进行跳过校验的处理,还是比较有安全性的。
现先介绍测试文件,就3个,分别为vcode.php(验证码生成程序) 、test.php(显示验证码与发送校验的页面)和check.php(校验处理页面)。原理:在test.php中可以显示验证码图片并可输入对应的验证码,通过点击“go”按钮发送验证码信息给check.php校验,check.php校验后按照成功与否给出对应信息或执行相应程序。以下为各个文件的源代码:
首先是vcode.php的源码(因插件显示关系,去掉了开头的"<?php"与结尾的"?>",请务必记得加上):
$w = 80; //设置图片宽和高 $h = 22; $str = Array(); //用来存储随机码 $string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//随机挑选其中4个字符,也可以选择更多,注意循环的时候加上,宽度适当调整 $vcode = ""; for($i = 0;$i < 4;$i++){ $str[$i] = $string[rand(0,35)]; $vcode .= $str[$i]; } session_start(); //启用超全局变量session $_SESSION["codevalue"] = $vcode; $im = imagecreatetruecolor($w,$h); $white = imagecolorallocate($im,255,255,255); //第一次调用设置背景色 $black = imagecolorallocate($im,204,204,204); //边框颜色 imagefilledrectangle($im,0,0,$w,$h,$white); //画一矩形填充 imagerectangle($im,0,0,$w-1,$h-1,$black); //画一矩形框 //生成雪花背景 for($i = 1;$i < 200;$i++){ $x = mt_rand(1,$w-9); $y = mt_rand(1,$h-9); $color = imagecolorallocate($im,mt_rand(180,255),mt_rand(150,255),mt_rand(180,255)); imagechar($im,0,$x,$y,"#",$color); } //将验证码写入图案 for($i = 0;$i < count($str);$i++){ $x = 13 + $i * ($w - 15)/4; $y = mt_rand(0,$h / 3); $color = imagecolorallocate($im,mt_rand(0,225),mt_rand(0,150),mt_rand(0,225)); // $color = imagecolorallocate($im,0,0,0); imagechar($im,5,$x,$y,$str[$i],$color); } header("Content-type:image/bmp"); //以jpeg格式输出,注意上面不能输出任何字符,否则出错 imagejpeg($im); imagedestroy($im);
下面是test.php源码(其实html文件就可以了):
最后是校验页换一个?
以下为check.php的源码(记得也要加头和尾哦):
session_start(); if(isset($_SESSION["codevalue"]) && $_SESSION["codevalue"] != ""){ if(strtolower($_SESSION["codevalue"]) != strtolower($_GET["vcode"])){ //验证码错误时执行的代码 die ("wrong code"); } }else{ //验证码超时时执行的代码 die ( "time out"); } $_SESSION["codevalue"] = "";//清空验证码SESSION,以防被刷 unset($_SESSION["codevalue"]); //通过验证后执行的代码 echo "pass";
三个文件建立起来,把代码粘帖进去、保存,然后运行test.php就可以进行测试了。
对于本人来说,SESSION是一个新的学习点,以前从来没接触过,mark下来以后继续关注与学习。
因为代码比较简单,也不多加解释了,大家看注释和自己调试一下应该也差不多懂了,这次先到这里了,有问题可以留言,谢谢。
发表评论