目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止ocr),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
我们这里展示了如何编写php程序实现验证码功能:
代码一:
| php> <?php /* * filename: authpage.php * author: hutuworm * date: 2003-04-28 * @copyleft hutuworm.org */ srand((double)microtime()*1000000); //验证用户输入是否和验证码一致 if(isset($http_post_vars['authinput'])) { if(strcmp($http_post_vars['authnum'],$http_post_vars['authinput'])==0) echo "验证成功!"; else echo "验证失败!"; } //生成新的四位整数验证码 while(($authnum=rand()%10000)<1000); ?> <form action=authpage.php method=post> <table> 请输入验证码:<input type=text name=authinput style="width: 80px"><br> <input type=submit name="验证" value="提交验证码"> <input type=hidden name=authnum value=<? echo $authnum; ?>> <img src=authimg.php?authnum=<? echo $authnum; ?>> </table> </form> |
| php><?php /* * filename: authimg.php * author: hutuworm * date: 2003-04-28 * @copyleft hutuworm.org */ //生成验证码图片 header("content-type: image/png"); srand((double)microtime()*1000000); $im = imagecreate(58,28); $black = imagecolorallocate($im, 0,0,0); $white = imagecolorallocate($im, 255,255,255); $gray = imagecolorallocate($im, 200,200,200); imagefill($im,68,30,$gray); //将四位整数验证码绘入图片 imagestring($im, 5, 10, 8, $http_get_vars['authnum'], $black); for($i=0;$i<50;$i++) //加入干扰象素 { imagesetpixel($im, rand()%70 , rand()%30 , $black); } imagepng($im); imagedestroy($im); ?> |
本文程序在apache 2.0.45 + php 4.3.1环境下运行通过。
上文只是对验证码功能的一个简单实现,并没有考虑商用安全性问题。如果要增强安全性,将此功能投入商业应用,则可以通过以下几个步骤实现:
1. 启用session。
2. authnum在authimg.php中生成,并计算md5sum,存入session。
3. authpage.php将authinput计算md5sum后,与session中的authnum(md5sum)对比得出验证结果。
本站注:作者使用了简单的代码实现了很酷的功能。不过在添加干扰像素时的效果不是太好,大家可以看一下雨声论坛登录时的效验码(http://ror.cn/perl/ut/user_login.cgi),偶把第二段代码稍改了一下,生成了与其类似的效果。
修改后的代码如下:
php><?php
/*
* filename: authimg.php
* author: hutuworm
* date: 2003-04-28
* @copyleft hutuworm.org
*/
//生成验证码图片
header("content-type: image/png");
srand((double)microtime()*1000000);
$im = imagecreate(62,20);
$black = imagecolorallocate($im, 0,0,0);
$white = imagecolorallocate($im, 255,255,255);
$gray = imagecolorallocate($im, 200,200,200);
imagefill($im,68,30,$gray);
while(($authnum=rand()%100000)<10000);
//将四位整数验证码绘入图片
imagestring($im, 5, 10, 3, $authnum, $black);
for($i=0;$i<200;$i++) //加入干扰象素
{
$randcolor = imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);
}
imagepng($im);
imagedestroy($im);
?>
显示结果如下图:
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器