/user_guide_src/source/helpers/captcha_helper.rst
https://github.com/dchill42/CodeIgniter · ReStructuredText · 143 lines · 109 code · 34 blank · 0 comment · 0 complexity · becfa297696adb0a2b87cf6bc549e743 MD5 · raw file
- ##############
- CAPTCHA Helper
- ##############
- The CAPTCHA Helper file contains functions that assist in creating
- CAPTCHA images.
- .. contents:: Page Contents
- Loading this Helper
- ===================
- This helper is loaded using the following code
- ::
- $this->load->helper('captcha');
- The following functions are available:
- create_captcha()
- ================
- .. php:function:: function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')
- :param array $data: Array of data for the CAPTCHA
- :param string $img_path: Path to create the image in
- :param string $img_url: URL to the CAPTCHA image folder
- :param string $font_path: Server path to font
- :returns: array('word' => $word, 'time' => $now, 'image' => $img)
- Takes an array of information to generate the CAPTCHA as input and
- creates the image to your specifications, returning an array of
- associative data about the image.
- ::
- array(
- 'image' => IMAGE TAG
- 'time' => TIMESTAMP (in microtime)
- 'word' => CAPTCHA WORD
- )
- The **image** is the actual image tag::
- <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />
- The **time** is the micro timestamp used as the image name without the
- file extension. It will be a number like this: 1139612155.3422
- The **word** is the word that appears in the captcha image, which if not
- supplied to the function, will be a random string.
- Using the CAPTCHA helper
- ------------------------
- Once loaded you can generate a captcha like this::
- $vals = array(
- 'word' => 'Random word',
- 'img_path' => './captcha/',
- 'img_url' => 'http://example.com/captcha/',
- 'font_path' => './path/to/fonts/texb.ttf',
- 'img_width' => '150',
- 'img_height' => 30,
- 'expiration' => 7200
- );
- $cap = create_captcha($vals);
- echo $cap['image'];
- - The captcha function requires the GD image library.
- - Only the **img_path** and **img_url** are required.
- - If a **word** is not supplied, the function will generate a random
- ASCII string. You might put together your own word library that you
- can draw randomly from.
- - If you do not specify a path to a TRUE TYPE font, the native ugly GD
- font will be used.
- - The "captcha" folder must be writable (666, or 777)
- - The **expiration** (in seconds) signifies how long an image will remain
- in the captcha folder before it will be deleted. The default is two
- hours.
- Adding a Database
- -----------------
- In order for the captcha function to prevent someone from submitting,
- you will need to add the information returned from ``create_captcha()``
- to your database. Then, when the data from the form is submitted by
- the user you will need to verify that the data exists in the database
- and has not expired.
- Here is a table prototype::
- CREATE TABLE captcha (
- captcha_id bigint(13) unsigned NOT NULL auto_increment,
- captcha_time int(10) unsigned NOT NULL,
- ip_address varchar(45) NOT NULL,
- word varchar(20) NOT NULL,
- PRIMARY KEY `captcha_id` (`captcha_id`),
- KEY `word` (`word`)
- );
- Here is an example of usage with a database. On the page where the
- CAPTCHA will be shown you'll have something like this::
- $this->load->helper('captcha');
- $vals = array(
- 'img_path' => './captcha/',
- 'img_url' => 'http://example.com/captcha/'
- );
- $cap = create_captcha($vals);
- $data = array(
- 'captcha_time' => $cap['time'],
- 'ip_address' => $this->input->ip_address(),
- 'word' => $cap['word']
- );
- $query = $this->db->insert_string('captcha', $data);
- $this->db->query($query);
- echo 'Submit the word you see below:';
- echo $cap['image'];
- echo '<input type="text" name="captcha" value="" />';
- Then, on the page that accepts the submission you'll have something like
- this::
- // First, delete old captchas
- $expiration = time() - 7200; // Two hour limit
- $this->db->where('captcha_time < ', $expiration)
- ->delete('captcha');
- // Then see if a captcha exists:
- $sql = 'SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?';
- $binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
- $query = $this->db->query($sql, $binds);
- $row = $query->row();
- if ($row->count == 0)
- {
- echo 'You must submit the word that appears in the image.';
- }