用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 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
php格式化工具Beautify PHP小小BUG
Apr 24 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php限制ip地址范围的方法
Mar 31 PHP
PHP模块化安装教程
Jun 01 PHP
PHP实现支持加盐的图片加密解密
Sep 09 PHP
PHP快速推送微信模板消息
Apr 14 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
php 获取xml接口数据的处理方法
May 31 PHP
php curl优化下载微信头像的方法总结
Sep 07 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正确配置mysql(apache环境)
2011/08/28 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Python之父谈Python的未来形式
2016/07/01 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Python 加密与解密小结
2018/12/06 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
造型师求职自荐信
2013/09/27 职场文书
前台文员岗位职责及工作流程
2013/11/19 职场文书
市场开发计划书
2014/05/07 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
行为规范主题班会
2015/08/13 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书