CAPTCHA 辅助函数

验证码辅助函数用来生成图片验证码

加载辅助函数

用下面的代码加载验证码辅助函数:

  1. $this->load->helper('captcha');
可用的函数如下: ## create_captcha($data) 根据你指定的一系列参数创建验证码图像, 返回值是一个包含此图像数据的数组.
  1. [array]
  2. (
  3. 'image' => IMAGE TAG
  4. 'time' => TIMESTAMP (毫秒)
  5. 'word' => CAPTCHA WORD
  6. )
"image"是实际存在image标记:
  1. <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />

这里的"time"是一个毫秒级的时间戳,作为图片文件名(不包含扩展名). 就像这样: 1139612155.3422

"word"是验证码, 如果不提供, 将是一个随机字符串.

使用验证码辅助函数:

加载后你可以像这样产生一个验证码:

  1. $vals = array(
  2. 'word' => 'Random word',
  3. 'img_path' => './captcha/',
  4. 'img_url' => 'http://example.com/captcha/',
  5. 'font_path' => './path/to/fonts/texb.ttf',
  6. 'img_width' => '150',
  7. 'img_height' => 30,
  8. 'expiration' => 7200
  9. );
  10. $cap = create_captcha($vals);
  11. echo $cap['image'];
  • 验证码辅助函数必须需要GD库.
  • 只有 img_path 和 img_url 参数是必须的.
  • 如果"word"未提供, 将自动产生一个ASCII字符串. 你也可以使用自己的词库,从里面随机挑选.
  • 如果未提供TRUE TYPE字体的路径, 将会使用GD自带的字体.
  • "captcha" 目录必须可写(666, or 777)
  • "expiration" (秒) 指定了验证码图片的超时删除时间. 默认是2小时.

配合数据库

为了在提交表单时用到验证,你需要将create_captcha()生成的结果保存到数据库。这样,当用户提交表单时,你就可以验证数据库里是否有此验证码或是否过期。

这是一个数据表的例子:

  1. CREATE TABLE captcha (
  2. captcha_id bigint(13) unsigned NOT NULL auto_increment,
  3. captcha_time int(10) unsigned NOT NULL,
  4. ip_address varchar(16) default '0' NOT NULL,
  5. word varchar(20) NOT NULL,
  6. PRIMARY KEY `captcha_id` (`captcha_id`),
  7. KEY `word` (`word`)
  8. );
这是一个使用数据库的例子. 一个带验证码的页面显示如下:
  1. $this->load->helper('captcha');
  2. $vals = array(
  3. 'img_path' => './captcha/',
  4. 'img_url' => 'http://example.com/captcha/'
  5. );
  6. $cap = create_captcha($vals);
  7. $data = array(
  8. 'captcha_time' => $cap['time'],
  9. 'ip_address' => $this->input->ip_address(),
  10. 'word' => $cap['word']
  11. );
  12. $query = $this->db->insert_string('captcha', $data);
  13. $this->db->query($query);
  14. echo '提交下面的验证码:';
  15. echo $cap['image'];
  16. echo '<input type="text" name="captcha" value="" />';
然后页面提交后如下处理:
  1. // 首先删除旧的验证码
  2. $expiration = time()-7200; // 2小时限制
  3. $this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
  4. // 然后再看是否有验证码存在:
  5. $sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
  6. $binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
  7. $query = $this->db->query($sql, $binds);
  8. $row = $query->row();
  9. if ($row->count == 0)
  10. {
  11. echo "你必须提交图像上显示的验证码";
  12. }

翻译贡献者:CosyBoy, Hex, Jacklee, LSvKing, 杜建宇