用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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
解析crontab php自动运行的方法
Jun 24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
php微信开发之关注事件
Jun 14 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
js中的this关键字详解
2013/09/25 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Django实现celery定时任务过程解析
2020/04/21 Python
利用python 读写csv文件
2020/09/10 Python
python 批量将中文名转换为拼音
2021/02/07 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
面试求职的个人自我评价
2013/11/16 职场文书
商务专员岗位职责
2013/11/23 职场文书
实习协议书范本
2014/04/22 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
nginx配置之并发频次限制
2022/04/18 Servers