用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 相关文章推荐
实用函数2
Nov 08 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
微信红包随机生成算法php版
Jul 21 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
PHP lcfirst()函数定义与用法
Mar 08 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实现WEB动态网页静态
2006/10/09 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
Javascript 二维数组
2009/11/26 Javascript
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Python读写Excel文件的实例
2013/11/01 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python使用mysql数据库示例代码
2017/05/21 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Django权限机制实现代码详解
2018/02/05 Python
python去除文件中重复的行实例
2018/06/29 Python
python将list转为matrix的方法
2018/12/12 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
html5开发之viewport使用
2013/10/17 HTML / CSS
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
写自荐信的注意事项
2014/03/09 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
读书月活动方案
2014/05/22 职场文书
农行心得体会
2014/09/02 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS