用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 相关文章推荐
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 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 strcmp使用说明
2010/04/22 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
react native与webview通信的示例代码
2017/09/25 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python中生成Epoch的方法
2017/04/26 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
详解python中*号的用法
2019/10/21 Python
python的faker库用法
2019/11/28 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
Sony C++笔试题
2013/03/10 面试题
最新大学生自我评价
2013/09/24 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
交通志愿者活动总结
2014/06/27 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
如何用PHP实现多线程编程
2021/05/26 PHP
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
Python中第三方库Faker的使用详解
2022/04/02 Python
Python采集壁纸并实现炫轮播
2022/04/30 Python
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技