验证码辅助函数

验证码辅助函数文件包含了一些帮助你创建验证码图片的函数。

加载辅助函数

该辅助函数通过下面的代码加载:

  1. $this->load->helper('captcha');

使用验证码辅助函数

辅助函数加载之后你可以像下面这样生成一个验证码图片:

  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. 'word_length' => 8,
  10. 'font_size' => 16,
  11. 'img_id' => 'Imageid',
  12. 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
  13.  
  14. // White background and border, black text and red grid
  15. 'colors' => array(
  16. 'background' => array(255, 255, 255),
  17. 'border' => array(255, 255, 255),
  18. 'text' => array(0, 0, 0),
  19. 'grid' => array(255, 40, 40)
  20. )
  21. );
  22.  
  23. $cap = create_captcha($vals);
  24. echo $cap['image'];
  • 验证码辅助函数需要使用 GD 图像库。
  • 只有 img_pathimg_url 这两个参数是必须的。
  • 如果没有提供 word 参数,该函数将生成一个随机的 ASCII 字符串。你也可以使用自己的词库,从里面随机挑选。
  • 如果你不设置 TRUE TYPE 字体(译者注:是主要的三种计算机矢量字体之一)的路径,将使用 GD 默认的字体。
  • "captcha" 目录必须是可写的。
  • expiration 参数表示验证码图片在删除之前将保留多久(单位为秒),默认保留 2 小时。
  • word_length 默认值为 8, pool 默认值为 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  • font_size 默认值为 16,GD 库的字体对大小有限制,如果字体大小需要更大一点的话可以设置一种 TRUE TYPE 字体。
  • img_id 将会设置为验证码图片的 "id" 。
  • colors 数组中如果有某个颜色未设置,将使用默认颜色。

添加到数据库

使用验证码函数是为了防止用户胡乱提交,要做到这一点,你需要将 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(45) 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.  
  7. $cap = create_captcha($vals);
  8. $data = array(
  9. 'captcha_time' => $cap['time'],
  10. 'ip_address' => $this->input->ip_address(),
  11. 'word' => $cap['word']
  12. );
  13.  
  14. $query = $this->db->insert_string('captcha', $data);
  15. $this->db->query($query);
  16.  
  17. echo 'Submit the word you see below:';
  18. echo $cap['image'];
  19. echo '<input type="text" name="captcha" value="" />';

然后在处理用户提交的页面,处理如下:

  1. // First, delete old captchas
  2. $expiration = time() - 7200; // Two hour limit
  3. $this->db->where('captcha_time < ', $expiration)
  4. ->delete('captcha');
  5.  
  6. // Then see if a captcha exists:
  7. $sql = 'SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?';
  8. $binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
  9. $query = $this->db->query($sql, $binds);
  10. $row = $query->row();
  11.  
  12. if ($row->count == 0)
  13. {
  14. echo 'You must submit the word that appears in the image.';
  15. }

可用函数

该辅助函数有下列可用函数:

  • createcaptcha([$data = ''[, $imgpath = ''[, $img_url = ''[, $font_path = '']]]])

参数:

  • $data (array) — Array of data for the CAPTCHA
  • $img_path (string) — Path to create the image in
  • $img_url (string) — URL to the CAPTCHA image folder
  • $font_path (string) — Server path to font返回:array('word' => $word, 'time' => $now, 'image' => $img)返回类型:array

根据你提供的一系列参数生成一张验证码图片,返回包含此图片信息的数组。

  1. array(
  2. 'image' => IMAGE TAG
  3. 'time' => TIMESTAMP (in microtime)
  4. 'word' => CAPTCHA WORD
  5. )

image 就是一个 image 标签:

  1. <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />

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

word 是验证码图片中的文字,如果在函数的参数中没有指定 word 参数,这将是一个随机字符串。