用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 FPDF类库应用实现代码
Mar 20 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 PHP
php处理复杂xml数据示例
Jul 11 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
详解php命令注入攻击
Apr 06 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 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的curl实现get和post的代码
2008/08/23 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
Python实现比较两个列表(list)范围
2015/06/12 Python
python正则表达式的使用
2017/06/12 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
python中altair可视化库实例用法
2021/01/26 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
优秀党支部事迹材料
2014/01/14 职场文书
三字经教学反思
2014/04/26 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS