Капча на php в виде математического примера

На многих сайтах сейчас можно увидеть формы бронирования и заказа чего либо. Эти формы предназначены для пользователей, но часто их перехватывают роботы и отправляют спам владельцу сайта.

Чтобы нейтрализовать злоумышленников или хотя бы усложнить им жизнь, программисты ставят капчу - метод защиты при котором пользователю нужно подтвердить, что он человек. Например, в гугл капче придется искать картинки (и это жутко неудобно), а в других юзера могут заставить собирать мозайку, разгадывать картинку или решать математический пример. Рассмотрим, как сделать последний вариант.

Самое простое, что приходит на ум - две случайные переменные, которые должны складываться или вычитаться. Создайте index.php в UTF-8 без BOM и поместите в него такой код:

<?php header('Content-Type: text/html; charset=utf-8');
$asdkapcha1 = mt_rand(11, 20);
$asdkapcha2 = mt_rand(1, 10);
$asdkapcha3 = mt_rand(1, 2);
if ($asdkapcha3 == 1) $asdkapcha3 = "+";
if ($asdkapcha3 == 2) $asdkapcha3 = "-";
$randkapcha = $asdkapcha1.$asdkapcha3.$asdkapcha2;
$randkapchasrav = $asdkapcha1.','.$asdkapcha3.','.$asdkapcha2;

if (isset($_POST["butkapcha"])) {
$randkapchasravall = explode(',', $_POST["randkapchasrav"]);
if ($randkapchasravall[1] == "+") $randkapchasravalls = $randkapchasravall[0] + $randkapchasravall[2];
if ($randkapchasravall[1] == "-") $randkapchasravalls = $randkapchasravall[0] - $randkapchasravall[2];

if ($_POST["randkapcha"] == $randkapchasravalls) {
echo "Все верно! Сообщение отправлено";}
else echo "Не верно! Попробуйте снова.";}
?>

<form action="" method="post" name="forms">
Сколько будет: <?php echo $randkapcha;?>?
<input type="text" style="width: 30px" name="randkapcha" />
<input type="hidden" name="randkapchasrav" value="<?php echo $randkapchasrav;?>" />
<input type="submit" name="butkapcha" value="Отправить" >
</form>

Если вы запустите скрипт, то при неверном решении появится сообщение об ошибке. В противном случае вы можете отправить форму или сделать запись в БД.

В скрипте:

  • $asdkapcha1 и $asdkapcha2 - случайные числа. Их пределы вы можете регулировать как угодно.
  • $asdkapcha3 - генерирует знак операции.
  • $randkapcha - запись для вопроса пользователю, а $randkapchasrav - запись для сравнения

Этот скрипт получился очень небольшим и мне удалось использовать его без сессий. В прошлом я делал аналогичный, более сложный вариант, но он требовал сессии, что неудобно. При желании его можно оформить в виде функции. Все данные, которые пользователь должен решить, находятся в инпуте randkapchasrav, в формате через запятую. Если вас смущает, что знаки + и - так явно передаются в переменной, то вы можете вместо них использовать картинки для большей защиты.

На этом описание просто капчи заканчивается. Конечно, ее можно обойти, но для этого придется настроить робот именно на ваш сайт.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Введите капчу: