• UID19
  • 登录2016-09-05
  • 粉丝10
  • 关注12
  • 发帖42
  • 主页
  • 金币837枚
社区居民
乾坤一掷 发布于2015-08-08 17:59
0/1341

验证码之php实现

楼层直达
验证码是为了区分用户是计算机还是人,可以防止:恶意破解密码、刷票、论坛灌水、刷页等。下面是一些容易识别的验证码,希望引起网站管理者的重视。

描述:验证码示例

图片:verifycode.jpg

验证码示例

制作验证码的一些建议:
对于识别验证码的程序来说,最难得部分是验证字符的切割和特征码的建立,而国内很多程序员只做验证码时,总是喜欢在验证码加很多干扰素,干扰线,影响效果不说,还达不到很好的效果;所以,要想使自己验证码难于本识别,只做下面两点就够了 。
1 :字符粘连,最好所有的字符都有粘连的部分;
2 :不要使用规格字符,验证码的各个部分使用不同比例的缩放或者旋转。
只要做到这两点,或者这两点的变形,识别程序就很难识别。


为了达到这种效果,下面提供PHP代码。
class ValidateCode
{
      
    private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';
    // 随机因子
    private $code;
    // 验证码
    private $codelen = 4;
    // 验证码长度
    private $width = 130;
    // 宽度
    private $height = 50;
    // 高度
    private $img;
    // 图形资源句柄
    private $font;
    // 指定的字体
    private $fontsize = 20;
    // 指定字体大小
    private $fontcolor;
    // 指定字体颜色
    // 构造方法初始化
    public function __construct()
    {
        $this->font = dirname(__FILE__) . '/font/elephant.ttf'; // 注意字体路径要写对,否则显示不了图片
    }
    // 生成随机码
    private function createCode()
    {
        $_len = strlen($this->charset) - 1;
        for ($i = 0; $i < $this->codelen; $i ++) {
            $this->code .= $this->charset[mt_rand(0, $_len)];
        }
    }
    // 生成背景
    private function createBg()
    {
        $this->img = imagecreatetruecolor($this->width, $this->height);
        $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
    }
    // 生成文字
    private function createFont()
    {
        $_x = $this->width / $this->codelen - 15;
        for ($i = 0; $i < $this->codelen; $i ++) {
            $this->fontcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imagettftext($this->img, $this->fontsize, mt_rand(- 30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $this->fontcolor, $this->font, $this->code[$i]);
        }
    }
    // 生成线条、雪花
    private function createLine()
    {
        // 线条
        for ($i = 0; $i < 6; $i ++) {
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
        }
        // 雪花
        for ($i = 0; $i < 100; $i ++) {
            $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
        }
    }
    // 输出
    private function outPut()
    {
        Header("Content-type: image/PNG");
        imagepng($this->img);
        imagedestroy($this->img);
    }
    // 对外生成
    public function doimg()
    {
        $this->createBg();
        $this->createCode();
        $this->createLine();
        $this->createFont();
        $this->outPut();
    }
    // 获取验证码
    public function getCode()
    {
        return strtolower($this->code);
    }
}

生成验证码效果图:

描述:效果图

图片:verify.png

效果图

代码说明:
1.粘连是在createFont函数 $_x = $this->width / $this->codelen - 15;这一行实现的。
2.文字大小旋转是在 imagettftext 函数这里做的这里做的。
3.验证码由字符和数字组成,去掉了难以识别的字符i,l,o,数字1,0。不区分大小写。

4.不依靠第三方库,几个用几个简单的基础函数就能实现。
5.可以很容易修改字体,内容等参数生成效果更多更好的验证码。
6.多个用户同时访问验证页面,或者刷新页面,刷新验证码,还需要加上session部分的代码,demo中有完整实现。


详细的demo,见附件。

参考:
http://blog.csdn.net/ugg/article/details/3972368

Note:本源代码由“极分享”社区创建,添加或者修改,我们会持续优化源代码以提供更好的解决方案,更多详情和支持请前往finalshares.com
[乾坤一掷于2015-08-10 11:04编辑了帖子]

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 59909/343   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 33115/188   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 31792/141   省时省力的Android组件群来了,非常棒的原型参考

  • 28843/223   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 26182/2   超全!整理常用的iOS第三方资源

  • 25584/0   Python爬虫:常用浏览器的useragent

  • 24676/70   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 22842/138   2016抢红包软件及源码

  • 19938/29   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 19784/25   Android工程师面试题大全

  • 19190/27   2016程序员跳槽全攻略

  • 18982/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 18500/20   码魂:程序员的牛B漫画

  • 16859/3   吐槽那些程序员的搞笑牛逼注释

  • 16782/149   Android版类似UC浏览器:非常赞,产品级的源码

  • 15690/1   iOS 动画总结

  • 15210/41   一个绚丽的loading动效分析与实现!

  • 15195/10   2016年最全的Android面试考题+答案 精编版

  • 14779/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 14723/83   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 14649/10   女程序员的梦,众网友的神回复

  • 14508/44   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 14456/11   年会上现场review代码是怎么样的体验!

  • 14158/23   个人收集的Android 各类功能源代码

  • 14077/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 13260/19   珍藏多年的素材,灵感搜寻网站

  • 13212/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 12872/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 12754/15   基于Android支付宝支付设计和开发方案

  • 12714/74   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 12494/20   Android福利第三波【Android电子书】

  • 12310/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 12127/18   65条最常用正则表达式,你要的都在这里了

  • 12116/94   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 11989/70   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 11721/7   用程序员的姿势抢过年的火车票

  • 11666/7   一张图搞定iOS学习路线,非常全面

  • 11606/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 11584/0   iOS中文版资源库,非常全

  • 11139/10   成为Java顶尖程序员 ,看这11本书就够了

  • 10873/18   一张图搞定Android学习路线,非常全面

  • 10810/10   微信支付终于成功了(安卓,iOS),在此分享

  • 10458/44   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 10428/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 10336/29   【持续更新中】Android福利贴(一):资料源码

  • 10329/0   GitHub iOS 库和框架Top100 

  • 9903/4   46 个非常有用的 PHP 代码片段

  • 9672/3   即时通信第三方库

  • 9563/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 9496/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 9447/8   流媒体视频直播方案

  • 9299/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 9181/18   八个最优秀的Android Studio插件

  • 9151/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 9056/9   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 8620/6   开箱即用!Android四款系统架构工具

  • 8515/3   一张图看清Linux 内核运行原理

  • 8413/10   十大技巧快速提升Android应用开发性能

  • 8389/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 8073/1   Android性能优化视频,文档以及工具

  • 返回顶部