兄弟姐妹们,好久不见了哟!军哥这次又给大伙带来一些新东东――关于在线生成验证码。希望对你有用,请一定要往下看哟!
引子:上网、发帖的时候不仅需要登录,有时候还需要验证码,这让我们很烦,心想,既然有了登录名,有了密码,还要什么验证码?验证码能有什么作用?几个数码,谁不会照着填呢?何必多此一举,脱裤子放屁自找麻烦?更要命的是,网上验证码都横七竖八,歪七八扭,让人很费劲。相信这是大多数普通的网民心中都存有的疑问,但是作为一个程序员的我们要必须清楚这样做的原因。如果不幸的你还不太清楚,那也没关系,我们一起来看一篇文章,来帮你补一补这个方面的知识,以下引自扬子晚报《网上验证码为什么都横七竖八?》:
引用“经常上网的人都知道,许多网站或者软件的登录都需要用到验证码,而验证码往往被设计得横七竖八很难辨识,这让很多眼神不好的人看上半天才能判断出来,有的还经常打错。市民朱先生想问一问,为什么要这样设计呢? 苏州市软件评测中心有限公司董爱平:这是一种保护用户账号安全的方式。以前登录的传统模式是用户名加密码,但是出现了密码破译软件,在知道用户名的情况下,通过穷举法可一个一个的进行密码组合试探,在密码长度不长且不够复杂的情况下,这些密码破译软件能轻松的破译出用户密码。为了规避此安全风险,验证码应运而生,在不输入验证码的情况下,破译软件无法连续执行。验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。但紧接着又出现了自动识别验证码的软件,在验证码较简单(基于文字形式)的情况下,很容易自动识别出。魔高一尺,道高一丈,现在的验证码做成了图形格式、问题格式(例如 1+2=?),让此类自动识别验证码软件再无漏洞可钻。所以大家对目前网站上面验证码设计成横七竖八的样子或者干脆是一道诸如“1+1=?”的问题,应该能够理解了吧。对于网友来说,虽然这样登录麻烦一点,但是对于保护自己的账户安全还是很有必要的。”
通过以上文字的了解,我们知道了如果仅仅是提供一个验证码的功能还远远不够,还需要考虑更多的安全性问题,因为这是很有必要的,但是往往我们很多时候无法评估站点验证码的安全情况,我们想把更多的心思放在业务上。那我们如何做到这一点呢???方法肯定是有的。
军哥这里给大伙推荐一款名叫苞应的图像验证码(详情见官方网站,请挪步到http://www.hinsite.com)。相关介绍如下:
HCaptcha验证码 是与开发语言无关、样式可调整的免费图形验证码系统。1. 安全 系统可以非常有效地阻止网络机器人的注册,登录,内容发布,系统具有智能的辨识与阻止机器人访问能力,从而保护信息安全;2. 有效 系统提供的验证码是对用户容易辨识对识别器不容易辨别;3. 稳定 系统保证验证码的显示与验证快速与稳定;4. 易用 系统对不同语言PHP/JSP/ASP/ASP.NET[C#、VB]等主流语言提供验证码的显示与验证端代码与例子,开发者可以在几乎不需要更改代码的情况下集成到任何系统。系统还提供验证码样式的管理设置功能,不需要更改代码轻易地更改样式;5. 强大 系统除提供验证码外还提供各种统计功能与IP阻断等功能,安全性完全掌控在开发者手中;6. 与开发语言无关 系统API接口,通过HTTPS协议实现,任何语言都可以使用HCaptcha;7. 样式丰富 系统提供的自定义样式、JS支持模式、弹出模式、组件模式供开发者选择,每个模式可以选择多种样式;8. 支持范围广 系统不仅支持Web站点的验证码,同时支持Wap、客户端程序[IPhone/Android/PC Client]等支持HTTPS协议的系统。
下载地址:http://www.hinsite.com/index.php?u=hdk&s=download
接下来演示在CI中该如何来使用hcaptcha 验证码,军哥以一个注册表单为例子做说明,效果图如下所示:
一、类库(源码在CI_captcha/application/libraries/HCaptcha.php文件中,该文件原为苞应的类文件源码,军哥稍微修改了一下它的构造函数,以便更适合在CI框架中初始化验证码类库并传递参数)
- /**************************************************************************
- **
- ** HCaptcha 图形验证码校验类
- **
- * 版本: 1.0
- * 语言: PHP
- * 版权: 苞川科技[Hdriver]
- * 客户服务: +86 755 26649393 +86 18922849133
- * 客服邮箱: cs@hinsite.com
- * 发布日期: 2012-03-13
- * 适用平台: 苞应 http://www.hinsite.com
- **
- ***************************************************************************/
- class HCaptcha
- {
- public $Address;
- public $Server;
- public $Port;
- public $PrivateKey;
- public $RequestURL;
- public function __construct($params=array())
- {
- if($params['PrivateKey'] == "" || $params['RequestURL'] == "")
- {
- return -1;
- }
- $this->GetServerInfoByURL($params['RequestURL']);
- $this->PrivateKey = $params['PrivateKey'];
- $this->RequestURL = $this->GetVerifyShortURL($params['RequestURL']);
- $this->Connect();
- }
- function Connect()
- {
- return $this->Server = fsockopen($this->Address, $this->Port, $ErrorNo, $ErrorString, 5);
- }
- function Disconnect()
- {
- fclose($this->Server);
- }
- public function Verify($IP, $AuthCode, $Sid="")
- {
- if($IP == "")
- {
- return -1;
- }
- if($AuthCode == "")
- {
- return -2;
- }
- $Content = "&ip=".$IP."&c=".$AuthCode."&k=".$this->PrivateKey."&sid=".$Sid;
- $Out = "POST ".$this->RequestURL." HTTP/1.1\r\nHost: ".$this->Address."\r\nUser-Agent: Hinside\r\nReferer: http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."\r\nContent-Type: application/x-www-form-urlencoded;\r\nContent-Length: ".strlen($Content)."\r\nConnection: close\r\n\r\n".$Content;
- fputs($this->Server, $Out);
- $ReturnHeaders = "";
- while($str = trim(fgets($this->Server, 1024)))
- {
- $ReturnHeaders .= $str."\r\n";
- }
- $ReturnBody = "";
- while(!feof($this->Server))
- {
- $ReturnBody .= fgets($this->Server, 1024);
- }
- $this->Disconnect();
- return $ReturnBody;
- }
- public function GetServerInfoByURL($URLString="")
- {
- if($URLString == "")
- {
- return -1;
- }
- $URLArr = parse_url($URLString);
- if(isset($URLArr['host']))
- {
- $this->Address = $URLArr['host'];
- }
- else
- {
- $this->Address = "127.0.0.1";
- }
- if(isset($URLArr['port']))
- {
- $this->Port = $URLArr['port'];
- }
- else
- {
- $this->Port = 80;
- }
- }
- public function GetVerifyShortURL($URLString="")
- {
- if($URLString == "")
- {
- return -1;
- }
- $URLArr = parse_url($URLString);
- $ShortURL = "";
- if(isset($URLArr['path']))
- {
- $ShortURL .= $URLArr['path'];
- }
- if(isset($URLArr['query']))
- {
- $ShortURL .= "?".$URLArr['query'];
- }
- if($ShortURL == "")
- {
- $ShortURL = "/";
- }
- return $ShortURL;
- }
- }
二、控制器(源码在CI_captcha/application/controllers/login.php文件中)
- /**
- * 功能:登录控制器
- * @author JayJun
- * @copyright 2012.10.11
- */
- class login extends CI_Controller {
- // 构造函数
- function __construct() {
- parent::__construct();
- }
- // 登录页
- function index() {
- $this->load->helper('form');
- $this->load->view('login_index');
- }
- // 验证登录(这里只显示执行验证验证码的效果)
- function check() {
- $params = array(
- 'RequestURL' => 'https://api.hinsite.com/default.php?u=hcaptcha&s=verify',//hcaptcha 服务器的验证地址
- 'PrivateKey' => 'db7c960fab64cc94fd7b83b6760d4c6b'
- );
- $this->load->library('HCaptcha',$params);//初始化验证码类库,在初始化时传递参数
- $data = $this->hcaptcha->Verify(isset($_POST['HCaptchaRemoteAddr']) ? $_POST['HCaptchaRemoteAddr'] : $_SERVER['REMOTE_ADDR'], isset($_POST['HCaptchaInput']) ? $_POST['HCaptchaInput'] : "", isset($_POST['HCaptchaSid'])? $_POST['HCaptchaSid'] : "");
- $info = '';
- if($data == -1){
- echo $info = "验证码输入错误";
- echo anchor('login/', '返回验证码页面', 'title="返回验证码页面!"');
- }else if($data == 1){
- echo $info = "验证码正确";
- echo anchor('login/', '返回验证码页面', 'title="返回验证码页面!"');
- }
- }
- }
三、视图(源码在CI_captcha/application/views/login_index.php文件中)
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>在CI框架中,使用在线验证码的例子</title>
- <link rel="stylesheet" href="<?php echo base_url('public/css/base.css');?>" type="text/css" />
- <link rel="stylesheet" href="<?php echo base_url('bootstrap/css/bootstrap.min.css');?>" type="text/css" />
- </head>
- <body>
- <!--登陆表单开始 -->
- <form action="<?php echo site_url('login/check');?>" class="form-horizontal mt20 w600" method="post">
- <fieldset>
- <legend class="fb">注册表单</legend>
- <div class="control-group">
- <label class="control-label">您的用户名:</label>
- <div class="controls">
- <input type="text" class="input-small">
- <p class="help-block">字母,数字,汉字皆可</p>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">设置密码:</label>
- <div class="controls">
- <input type="password" class="input-small">
- <p class="help-block">密码为6位以上</p>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">重复密码:</label>
- <div class="controls">
- <input type="password" class="input-small">
- <p class="help-block">密码需填写一致</p>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">您的个人网址:</label>
- <div class="controls">
- <input type="text" class="input-big">
- <p class="help-block">请输入您的个人网址,以便我们收录</p>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">验证码:</label>
- <div class="controls">
- <!-- 加载hcaptcha服务器的API接口 -->
- <script type="text/javascript" src="https://api.hinsite.com/index.php?u=hcaptcha&s=module&k=81e983145466549944d88fe156c1c2e7"></script>
- </div>
- </div>
- <div class="form-actions">
- <button type="submit" class="btn btn-primary">提交注册</button>
- <button class="btn">取消</button>
- </div>
- </fieldset>
- </form>
- <!--登陆表单结束 -->
- </body>
- </html>
四、代码部署:
(1)、先下载附件,解压之后,拷贝到网站根目录下;
(2)、修改配置文件CI_captcha/application/config/database.php,只需设置$db['default']['password'] =’你的数据库密码’; ,大概第10行;
(3)、直接在浏览器中输入http://localhost/CI_captcha/index.php/login即可访问。