本人实测可用的简单PHP图形验证码源码

3,921次阅读
没有评论

本人乃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文件就可以了):

<p><img id="CodeImg" style="cursor: pointer;" title="看不清?点击刷新!" src="vcode.php" alt="看不清?点击刷新" align="absmiddle" /><br />
<span style="text-decoration: underline; cursor: pointer;">换一个?</span></p>
<form action="check.php" method="get" name="form1">验证码: <input id="vcode" class="text" style="width: 100px;" name="vcode" type="text" /> <input type="submit" value="go" /></form>

最后是校验页
以下为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下来以后继续关注与学习。
因为代码比较简单,也不多加解释了,大家看注释和自己调试一下应该也差不多懂了,这次先到这里了,有问题可以留言,谢谢。

正文完
 0
评论(没有评论)