На многих сайтах сейчас можно увидеть формы бронирования и заказа чего либо. Эти формы предназначены для пользователей, но часто их перехватывают роботы и отправляют спам владельцу сайта.
Чтобы нейтрализовать злоумышленников или хотя бы усложнить им жизнь, программисты ставят капчу - метод защиты при котором пользователю нужно подтвердить, что он человек. Например, в гугл капче придется искать картинки (и это жутко неудобно), а в других юзера могут заставить собирать мозайку, разгадывать картинку или решать математический пример. Рассмотрим, как сделать последний вариант.
Самое простое, что приходит на ум - две случайные переменные, которые должны складываться или вычитаться. Создайте 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, в формате через запятую. Если вас смущает, что знаки + и - так явно передаются в переменной, то вы можете вместо них использовать картинки для большей защиты.
На этом описание просто капчи заканчивается. Конечно, ее можно обойти, но для этого придется настроить робот именно на ваш сайт.