用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 什么是PEAR?(第三篇)
Mar 19 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
php代码审计比较有意思的例子
May 07 PHP
thinkphp常见路径用法分析
Dec 02 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
微信公众号开发之通过接口删除菜单
Feb 20 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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制作简单的内容采集器的原理分析
2008/10/01 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
详解vue中axios的封装
2018/07/18 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python跳出多重循环的方法示例
2019/07/03 Python
python实现XML解析的方法解析
2019/11/16 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
优秀的自荐信要注意哪些
2014/01/03 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
python多线程方法详解
2022/01/18 Python
Redis 限流器
2022/05/15 Redis
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers