Помощник CAPTCHA
Файл помощника CAPTCHA содержит функци, которые обеспечивают работу с капчей.
Загрузка этого помощника
Этот помощник загружается при использовании следующего кода:
$this->load->helper('captcha');
Доступны следующие функции:
create_captcha($data)
Принимает массив информации для генерации капчи на вход, и создает изображение, возвращая ассоциативный массив с данными об изображении.
[array]
(
'image' => IMAGE TAG
'time' => TIMESTAMP (in microtime)
'word' => CAPTCHA WORD
)
"image" содержит реальный тег изображения: <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />
"time" это микровремя, используемое для картинки без расширения. Это будет номер вроде такого: 1139612155.3422
"word" это слово, которое появляется на картинке капчи. Если слово не передано функции, будет использована случайная строка.
Использование помощника CAPTCHA
После загрузки вы можете сгенерировать капчу, к примеру так:
$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'];
Функция капчи требует библиотеку GD.
Требуется указывать только img_path и img_url.
Если слово "word" не предоставлено, функция сгенерирует случайную строку ASCII. Вы можете иметь собственную библиотеку слов, из которой брать значения случайным образом.
Если вы не указали путь к шрифту TRUE TYPE, будет использован родной страшный шрифт GD.
Директория "captcha" должна быть записываемой (666 или 777)
Время истечения "expiration" (в секундах) обозначает, как долго изображение будет использоваться, до того, как будет удалено. По умолчанию два часа.
Добавление БД
Чтобы предотвратить функцию от неправильного использования, вы должны добавлять информацию из create_captcha() в базу данных. После того, как данные из формы переданы пользователем, вы должны будете проверить их существование в базе данных, а также неистечение времени хранения.
Вот прототип таблицы:
CREATE TABLE captcha (
captcha_id bigint(13) unsigned NOT NULL auto_increment,
captcha_time int(10) unsigned NOT NULL,
ip_address varchar(16) default '0' NOT NULL,
word varchar(20) NOT NULL,
PRIMARY KEY `captcha_id` (`captcha_id`),
KEY `word` (`word`)
);
Вот пример использования базы данных. На странице, где оторбажается капча, вы имеете что-то вроде этого:
$this->load->helper('captcha');
$vals = array(
'img_path' => './captcha/',
'img_url' => 'http://example.com/captcha/'
);
echo 'Submit the word you see below:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';
Тогда на странице, принимающей данные, вы должны иметь что-то вроде такого:
// Во-первых, удалите старую капчу
$expiration = time()-7200; // Двухчасовое ограничение
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
// Потом проверим существование капчи:
$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";
}
Пример blog.php:
(я создал в корне сайта папку "captcha" для хранения временных картинок)
<?php
class Blog extends CI_Controller {
function index()
{
$this->load->helper('captcha');