164 lines
5.0 KiB
ReStructuredText
164 lines
5.0 KiB
ReStructuredText
##############
|
||
CAPTCHA Helper
|
||
##############
|
||
|
||
The CAPTCHA Helper file contains functions that assist in creating
|
||
CAPTCHA images.
|
||
|
||
.. contents::
|
||
:local:
|
||
|
||
.. raw:: html
|
||
|
||
<div class="custom-index container"></div>
|
||
|
||
Loading this Helper
|
||
===================
|
||
|
||
This helper is loaded using the following code::
|
||
|
||
$this->load->helper('captcha');
|
||
|
||
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,
|
||
'word_length' => 8,
|
||
'font_size' => 16,
|
||
'img_id' => 'Imageid',
|
||
'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
||
|
||
// White background and border, black text and red grid
|
||
'colors' => array(
|
||
'background' => array(255, 255, 255),
|
||
'border' => array(255, 255, 255),
|
||
'text' => array(0, 0, 0),
|
||
'grid' => array(255, 40, 40)
|
||
)
|
||
);
|
||
|
||
$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" directory must be writable
|
||
- 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.
|
||
- **word_length** defaults to 8, **pool** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||
- **font_size** defaults to 16, the native GD font has a size limit. Specify a "true type" font for bigger sizes.
|
||
- The **img_id** will be set as the "id" of the captcha image.
|
||
- If any of the **colors** values is missing, it will be replaced by the default.
|
||
|
||
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.';
|
||
}
|
||
|
||
Available Functions
|
||
===================
|
||
|
||
The following functions are available:
|
||
|
||
.. php: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)
|
||
:rtype: array
|
||
|
||
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. |