用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初学者的8点有效建议
Nov 20 PHP
深入了解PHP类Class的概念
Jun 14 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
php有效防止同一用户多次登录
Nov 19 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
Laravel中10个有用的用法小结
May 06 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 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
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
php 强制下载文件实现代码
2013/10/28 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
PHP时间类完整代码实例
2021/02/26 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
javascript动态加载三
2012/08/22 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
python中__call__方法示例分析
2014/10/11 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
pycharm安装及如何导入numpy
2020/04/03 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
国外平面设计第一市场:99designs
2016/10/25 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
工地安全标语
2014/06/07 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
担保书范文
2015/01/20 职场文书
演讲比赛主持词
2015/06/29 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP