Помощник CAPTCHA
Файл помощника CAPTCHA содержит функции, которые помогают создавать изображения CAPTCHA.
Загрузка этого помощника
Этот помощник загружается следующим кодом:
$this->load->helper('captcha');
Доступны следующие функции:
captcha_create($data)
Принимает массив информации для генерации CAPTCHA, и создает изображение по вашим указаниям, возвращая ассоциативный массив с данными об изображении.
[array]
(
'image' => тег IMAGE
'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. Если оно не передано функции, это будет случайная строка.
Использование помощника CAPTCHA
После загрузки вы можете генерировать 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'];
- Функция captcha требует серверную библиотеку GD.
- Требуются только img_path и img_url.
- Если "word" не передано, функция сгенерирует случайную строку ASCII. Вы можете поместить собственную библиотеку слов, делая из нее случайные выборки.
- Если вы не указали путь к шрифту TRUE TYPE, будет использован родной шрифт GD.
- Директория "captcha" должна быть записываемой (установите соответствующие права)
- "Истекает" (expiration, в секундах) означает, насколько долго изображение будет храниться в директории captcha перед удалением. Значение по умолчанию — два часа.
Добавление базы данных
Чтобы функция captcha предотвращала submit логики, обслуживающей форму, вы должны добавить информацию, возвращаемую функцией 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`)
);
Вот пример использования с базой данных. На странице, где показывается CAPTCHA, вы разместите что-то вроде этого:
$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="" />';
Тогда, на странице, которая принимает данные из формы, вы разместите что-то вроде этого:
// Сперва удаляем старые captcha
$expiration = time()-7200; // Ограничение на два часа
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
// Потом проверяем существование captcha :
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND date > ?";
$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";
}