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

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据