用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 相关文章推荐
PHP面向对象分析设计的经验原则
Sep 20 PHP
php动态生成JavaScript代码
Mar 09 PHP
php 执行系统命令的方法
Jul 07 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
dedecms中使用php语句指南
Nov 13 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
php错误日志简单配置方法
Jul 11 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP学习笔记之session
May 06 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
微信支付的开发流程详解
2016/09/13 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
php测试kafka项目示例
2020/02/06 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
Python深入学习之对象的属性
2014/08/31 Python
python里将list中元素依次向前移动一位
2014/09/12 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
python实现机器学习之元线性回归
2018/09/06 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
如何使用repr调试python程序
2020/02/28 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
银行实习的自我鉴定
2013/12/10 职场文书
新年寄语大全
2014/04/12 职场文书
教师四风问题整改措施
2014/09/25 职场文书
地陪导游欢迎词
2015/01/26 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
运动员入场前导词
2015/07/20 职场文书
感恩教师节主题班会
2015/08/12 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL