用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 相关文章推荐
openPNE常用方法分享
Nov 29 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 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 日常开发小技巧
2009/09/23 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
js压缩利器
2007/02/20 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
python模拟事件触发机制详解
2018/01/19 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
python基础教程之while循环
2019/08/14 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
校园报刊亭的创业计划书
2014/01/02 职场文书
领导调研接待方案
2014/02/27 职场文书
春节晚会主持词
2014/03/24 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
道歉短信大全
2015/05/12 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python