用PHP实现验证码功能


Posted in PHP onOctober 09, 2006

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

??我们这里展示了如何编写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
   /*
    *   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
/*
 *   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);
?>

 

 

PHP 相关文章推荐
杏林同学录(九)
Oct 09 PHP
几种显示数据的方法的比较
Oct 09 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
PHP 登录记住密码实现思路
May 07 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
微信access_token的获取开发示例
Apr 16 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
PHP缓冲区用法总结
Feb 14 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
汉字转化为拼音(php版)
Oct 09 #PHP
如何限制访问者的ip(PHPBB的代码)
Oct 09 #PHP
substr()函数中文版
Oct 09 #PHP
如何使用PHP中的字符串函数
Oct 09 #PHP
vBulletin Forum 2.3.xx SQL Injection
Oct 09 #PHP
PHP_Flame(Version:Progress)的原代码
Oct 09 #PHP
图形数字验证代码
Oct 09 #PHP
You might like
10个简化PHP开发的工具
2014/12/25 PHP
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
用Python编写简单的定时器的方法
2015/05/02 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
python Tkinter的图片刷新实例
2019/06/14 Python
Python print不能立即打印的解决方式
2020/02/19 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
货代行业个人求职简历的自我评价
2013/10/22 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
社区八一活动方案
2014/02/03 职场文书
材料化学专业求职信
2014/07/15 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
技术员个人工作总结
2015/03/03 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书