Предлагаю вашему вниманию вариант довольно простой капчи, которая тем не менее неплохо себя зарекомендовала в борьбе со спамом. Данную капчу я в основном использую в тех случаях, когда клиент просит прикрутить защиту от ботов статичному сайту.
Возьмем простую форму с одним полем «Телефон» и окошком для ввода капчи.
<form method="post">
<label class="b-name">Телефон:<input type="text" min="6" name="tel" required="required"></label>
<label>Введите код:
<div style="clear: both;"></div>
<input style="width: 120px; float: left;" type="text" name="captcha" required="required"><img style="padding-top: 3px; width: 130px; float: left;" onclick="document.getElementById('captcha').src = 'captcha.php?' + Math.random()" src="captcha.php" alt="" id="captcha">
</label>
<input type="hidden" name="userip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>">
<div id="results"></div>
<input type="submit" value="Зарегистрироваться">
</form>
Возьмем простую форму с одним полем «Телефон» и окошком для ввода капчи.
<form method="post">
<label class="b-name">Телефон:<input type="text" min="6" name="tel" required="required"></label>
<label>Введите код:
<div style="clear: both;"></div>
<input style="width: 120px; float: left;" type="text" name="captcha" required="required"><img style="padding-top: 3px; width: 130px; float: left;" onclick="document.getElementById(‘captcha’).src = ‘captcha.php?’ + Math.random()" src="captcha.php" alt="" id="captcha">
</label>
<input type="hidden" name="userip" value="<?php echo $_SERVER[‘REMOTE_ADDR’]; ?>">
<div id="results"></div>
<input type="submit" value="Зарегистрироваться">
</form>
Обратите внимание на скрипт, помещенный в onclick. Он нужен для того, чтобы пользователь кликнув по картинке капчи мог запросить другие символы. Сама картинка капчи формируется в файле captcha.php
session_start(); // Начинаем сессию
$string = "";
for ($i = 0; $i < 4; $i++)
$string .= chr(rand(65, 90)); // Генерация случайных символов
$_SESSION['rand_code'] = $string; // Записываем код в сессию
$dir = "fonts/"; // Путь к папке со шрифтом
$image = imagecreatetruecolor(130, 22); // Создаём полотно
$color = imagecolorallocate($image, 0, 0, 0); // Задаём цвет текста
$white = imagecolorallocate($image, 255, 255, 255); // Создаём цвет заднего фона
imagefilledrectangle($image, 0, 0, 130, 22, $white); // Закрашиваем изображение
// Создаём текст на картинке
imagettftext ($image, 22, 0, 10, 22, $color, $dir."Intro.ttf", $_SESSION['rand_code']);
header("Content-type: image/png"); // Отправляем заголовок с типом содержимого
imagepng($image); // Выводим изображение капчи
Особых пояснений, я думаю, не требуется. Единственный момент — у вас должна быть папка fonts в которй должен лежать шрифт, который используется для генерации капчи. В моем случае это Intro.ttf.
Теперь остается взглянуть на обработчик формы. Он может быть как в отдельном файле (к примеру, так часто делают, когда задействуют аякс (отправку формы без перезагрузки страницы), так и в файле с формой.
session_start(); // обязательно стартуем сессию
if (!isset($_SESSION['rand_code']) or empty($_SESSION['rand_code'])) {
$error = "Ошибка капчи";
} else if (strtoupper($_SESSION['rand_code']) !== $_POST['captcha']) {
$error = "Капча введена неверно!";
}
if (empty($error)) {
… // тут у нас код, который отвечает за отправку формы
}
PS. Кстати, я всегда передаю скрытое поле с $_POST[‘userip’]. Зная ip спамщика можно написать простенький обработчик для внесения его в ЧС.