用PHP实现验证码功能

王朝php·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

我们这里展示了如何编写PHP程序实现验证码功能:

代码一:

<?php

/*

* Filename:authpage.php

* Author: hutuworm

* Date: 2004-09-26

* @Copylefthutuworm.org

*/

srand((double)microtime()*1000000);

//验证用户输入是否和验证码一致

if(isset())

{

if(strcmp(,)==0)

echo "验证成功!";

else

echo "验证失败!";

}

//生成新的四位整数验证码

while((=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 ; ?>>

<img src=authimg.php?authnum=<? echo ; ?>>

</table>

</form>

代码二:

<?php

/*

* Filename:authimg.php

* Author: hutuworm

* Date: 2003-04-28

* @Copylefthutuworm.org

*/

//生成验证码图片

Header("Content-type: image/PNG");

srand((double)microtime()*1000000);

= imagecreate(58,28);

= ImageColorAllocate(, 0,0,0);

= ImageColorAllocate(, 255,255,255);

= ImageColorAllocate(, 200,200,200);

imagefill(,68,30,);

//将四位整数验证码绘入图片

imagestring(, 5, 10, 8, , );

for(=0;<50;++) //加入干扰象素

{

imagesetpixel(, rand()%70 , rand()%30 , );

}

ImagePNG();

ImageDestroy();

?>

本文程序在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

/*

* Filename: authimg.php

* Author: hutuworm

* Date: 2004-09-26

* @Copyleft hutuworm.org

*/

//生成验证码图片

Header("Content-type: image/PNG");

srand((double)microtime()*1000000);

= imagecreate(62,20);

= ImageColorAllocate(, 0,0,0);

= ImageColorAllocate(, 255,255,255);

= ImageColorAllocate(, 200,200,200);

imagefill(,68,30,);

while((=rand()%100000)<10000);

//将四位整数验证码绘入图片

imagestring(, 5, 10, 3, , );

for(=0;<200;++) //加入干扰象素

{

= ImageColorallocate(,rand(0,255),rand(0,255),rand(0,255));

imagesetpixel(, rand()%70 , rand()%30 , );

}

ImagePNG();

ImageDestroy();

?>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航