用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
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
php中的三元运算符使用说明
Jul 03 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
PHP文件操作实例总结
Sep 27 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
PHP中的正则表达式函数介绍
2012/02/27 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
js判断节假日实例代码
2017/12/27 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
解读! Python在人工智能中的作用
2017/11/14 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
毕业学生推荐信
2013/12/01 职场文书
酒店总经理工作职责
2013/12/13 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
安全承诺书格式
2014/05/21 职场文书
环保志愿者活动方案
2014/08/14 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python