用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 相关文章推荐
MySQL 日期时间函数常用总结
Jun 12 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php实现比较全的数据库操作类
Jun 18 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php 多文件上传的实现实例
Oct 23 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
Laravel中前端js上传图片到七牛云的示例代码
Sep 04 PHP
php读取本地json文件的实例
Mar 07 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
python中实现字符串翻转的方法
2018/07/11 Python
详解python中sort排序使用
2019/03/23 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
如何在django中运行scrapy框架
2020/04/22 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
2014年大学生党员评议表自我评价
2014/09/20 职场文书
会议简报格式范文
2015/07/20 职场文书
《开国大典》教学反思
2016/02/16 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
Python实现简繁体转换
2021/06/07 Python
实战Python爬虫爬取酷我音乐
2022/04/11 Python