用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 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
优化PHP代码技巧的小结
Jun 02 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
Jun 12 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP自动重命名文件实现方法
Nov 04 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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实现的数字验证码及数字运算验证码
2015/07/30 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
Open and Print a Word Document
2007/06/15 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
js css自定义分页效果
2017/02/24 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
python实现将内容分行输出
2015/11/05 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
python 实现超级玛丽游戏
2020/11/25 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
《画风》教学反思
2014/04/16 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
总结会主持词
2015/07/02 职场文书
基层党建工作简报
2015/07/21 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers