В последнее время форумы, гостевые, да и всё, что только можно заполнить страдает от неимоверного количества спама. Это и понятно: спаммеры придумывают всё новые механизмы для своих спам-ботов.
Борцы за чистоту Интернет занимаются примерно тем же, только наоборот: придумывают всё новые методы защиты.
Немного о Captcha
Одним из таких методов является показ верификация при помощи Captcha перед тем, как разрешить пользователю отправить какие-либо данные.
Для справки:CAPTCHA (английская аббревиатура от «Completely Automated Public Turing test to tell Computers and Humans Apart» — полностью автоматизированный публичный тест Тьюринга для отделения людей от компьютеров) — торговая марка университета Карнеги-Мелона, компьютерный тест, используемый для того чтобы определить, человек ли использует систему. Термин появился в 2000 году. В наиболее распространённом варианте CAPTCHA от пользователя требуется ввести символы, изображённые, как правило, в искажённом виде на предлагаемом ему рисунке, иногда с добавлением шума или полу-прозрачности. Реже применяются CAPTCHA, основанные на распознавании речи (в основном как альтернатива для людей с нарушениями зрения), либо на других вариантах задач искусственного интеллекта.
Думаю, всем знакома эта картинка или её вариации.
Но хорошо ли это? Надо ли заставлять пользователя заполнять ненужные лично ему поля? Хочет ли на самом деле пользователь заполнять эти поля?
Неужели бота нельзя отличить по какому-либо другому признаку? Конечно можно!
Способ 1. Ловушка
Просмотрев исходные коды нескольких ботов, я пришёл к выводу, что боты в основной своей массе жадные: пытаются заполнить всё, что находят. Первый способ напрашивается сам собой.
Допустим, у нас имеется форма:
<form action="/register.php" method="post">
<input type="text" name="login" value="">
<input type="text" name="e-mail" value="">
<input type="submit" value="Отправить">
</form>
Добавим фиктивное поле с id=validator:
<form action="/register.php" method="post">
<input type="text" name="login" value="">
<input type="text" name="e-mail" value="">
<input id="validator" type="text" name="validator" value="">
<input type="submit" value="Отправить">
</form>
Допишем CSS для его сокрытия:
#validator{
display: none;
}
После этого остаётся поправить скрипт, которым обрабатываются данные из нашей формы:
// Если скрытое поле заполнили
if ($_POST['validator']!=''){
die('Ботам ходу нет!');
}
else{
// Тут обычная наша старая привычная обработка формы
}
Способ 2. Ловушка с подменой
Это всё хорошо, скажут многие, но у нас форум на одном из популярных движков. Под него специальные боты, которые заполняют только нужные поля. Да, всё так, но и тут есть выход.
Возьмём ту же форму:
<form action="/register.php" method="post">
<input type="text" name="login" value="">
<input type="text" name="e-mail" value="">
<input type="submit" value="Отправить">
</form>
Тут уже первый способ не пройдёт. Бот будет чётко заполнять поля login и e-mail. Ну да ладно... меняем форму:
<form action="/register.php" method="post">
<input class="validator" type="text" name="login" value="">
<input class="validator" type="text" name="e-mail" value="">
<input type="text" name="login2" value="">
<input type="text" name="e-mail2" value="">
<input type="submit" value="Отправить">
</form>
Правим CSS:
.validator{
display: none;
}
Ну и скрипт:
// Если скрытое поле заполнили
if ($_POST['login']!='' || $_POST['e-mail']!=''){
die('Ботам ходу нет!');
}
else{
// Тут работаем уже с $_POST['login2'] и $_POST['e-mail2']
}
Заключение
В заключение хочется пожелать всем не следовать за толпой. Будь то использование Captcha или что-то ещё. Относитесь к информации критично, следуйте своим путём.