PHP验证码机制的简单实现
作者:黑马
帐号和密码是Web页上的交互必不可少的,验证码有时也显得格外重要,尤其是在防恶意提交行为方面起到一定的阻拦作用。为此,我们需要一个验证码机制。
验证码通常需要一个由四个字母和(或)数字随机组成的文本字串。所以,我们首先随机生成验证码。以从0至9的数字为例,在PHP中可以非常方便地生成随机数:
$val_ar=array(0,1,2,3,4,5,6,7,8,9);
srand((double)microtime()*1000000);
shuffle($val_ar);
$i=0;
while($i<4) {
$vnum.=$val_ar[$i++];
}
以上代码中,给出0至9的数组$val_ar后用srand配置随机数种子,接着用shuffle()函数打乱数组$val_ar,再用while语句得到打乱后数组$val_ar的前四个元素(从第0个元素到第3个元素):$vnum。$vnum将是我们后面验证的依据。
通常,验证码总是要防止识别器的识别和复制,它们一般不以文本形式提供给用户,取代的提供方式是使用文本自身受一定干扰的图片,因此,我们事先得准备10个小数字图片,分别命名为0.gif、1.gif、2.gif……9.gif以对应数组序号、方便提取。要提取能够对应于随机数的图片名称,我们得先将图片地址按其名称顺序赋值给一个数组$vpic(我们假设图片放在目录images里面):
for($i=0;$i<10;$i++) {
$vpic[]="images/".$i.".gif";
}
然后,依据已经生成的四个随机数的元素值取得对应的图片:
for($i=0;$i<4;$i++) {
$idx=$val_ar[$i];
$picstr.="<img width=\"12\" height=\"12\" border=\"0\" src=\"$vpic[$idx]\">";
}
以上,我们已经完成了验证码随机数的生成并以图片形式显示给用户,下一步是如何验证用户的输入是否与验证码一致。我们需要一个form表单,其中有两个文本框,一个用于让用户输入验证码,另一个用于装载前面生成的验证码($vnum),它应该是不可见的,为此,设置它的宽度和高度均为0即可。比较两个文本框的值就能达到为验证目的。下面是整个程序的完整代码,代码里必要处已有若干说明:
<?php
if($id!="submit"){ //提交前
$val_ar=array(0,1,2,3,4,5,6,7,8,9); //给数组赋值
srand((double)microtime()*1000000); //配置随机种子
shuffle($val_ar); //打乱数组顺序
$i=0;
while($i<4) { //得到随机数
$vnum.=$val_ar[$i++];
}
for($i=0;$i<10;$i++) { //图片名称数组赋值
$vpic[]="images/".$i.".gif";
}
//以下是表单代码
$formstr="<form name=\"myform\" method=\"post\" action=\"$php_self?id=submit\">
<p>验证码: <input style=\"border:1px solid #ff0000;\" type=\"text\" name=\"valtxt\" size=\"6\" value=\"\">
<input style=\"width:0px;height:0px;border:0px;\" type=\"text\" name=\"validate\" size=\"4\" value=\"$vnum\">";
for($i=0;$i<4;$i++) { //验证码图片配置
$idx=$val_ar[$i];
$picstr.="<img width=\"12\" height=\"12\" border=\"0\" src=\"$vpic[$idx]\">";
}
$formstr.=$picstr."</p><p><input type=\"submit\" value=\" 提交 \" name=\"btn1\"></p></form>";
print $formstr;
}else{ //提交后
$valtxt==$validate?print "验证通过":print "验证码错误!";
}
?>
>> 测试实例
【 文章来源:本站原创[2008.2.16] 转载请注明作者及出处等信息 】
网 |

