Спам-боты постоянно сканируют сайты и атакуют формы обратной связи. Если ничего не делать — ваш почтовый ящик заполнится мусором. Вот 3 проверенных способа защиты, от простого к сложному.
Боты обычно заполняют все поля в форме. Добавьте скрытые поля — человек их не видит и не заполняет, а бот оставляет след.
<!-- Добавьте в форму прямо перед кнопкой отправки --> <input type="text" name="url" style="display:none" value=""> <input type="email" name="email" style="display:none" value="">
Проверка на сервере (PHP):
<?php
// Если скрытые поля заполнены — это бот
if (!empty($_POST['url']) || !empty($_POST['email'])) {
die('Спам-бот обнаружен');
}
?>
Пользователь должен решить простой пример. Бот не умеет считать.
<!-- Добавьте в форму -->
<div style="margin: 15px 0;">
<label>Сколько будет 2 + 5? <span style="color:red">*</span></label>
<input type="text" name="captcha_answer" placeholder="Введите число" required size="5">
<input type="hidden" name="captcha_num1" value="2">
<input type="hidden" name="captcha_num2" value="5">
</div>
Проверка на сервере:
<?php
$answer = $_POST['captcha_answer'] ?? '';
$num1 = $_POST['captcha_num1'] ?? 0;
$num2 = $_POST['captcha_num2'] ?? 0;
if (($num1 + $num2) != $answer) {
die('Неверный ответ на проверочный вопрос');
}
?>
Современная капча от Яндекса. Пользователь просто ставит галочку — бот не пройдет.
Шаг 1. Подключите скрипт:
<script src="https://smartcaptcha.yandexcloud.net/captcha.js" defer></script>
Шаг 2. Добавьте контейнер в форму:
<div id="captcha-container" class="smart-captcha"
data-sitekey="ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ">
</div>
<input type="hidden" name="smart-token" id="smart-token">
Шаг 3. Инициализация капчи:
<script>
document.addEventListener('DOMContentLoaded', function() {
const container = document.getElementById('captcha-container');
if (container && window.smartCaptcha) {
window.smartCaptcha.render(container, {
sitekey: 'ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ',
callback: function(token) {
document.getElementById('smart-token').value = token;
// Включаем кнопку отправки
document.querySelector('input[type="submit"]').disabled = false;
},
'expired-callback': function() {
document.getElementById('smart-token').value = '';
}
});
}
});
</script>
Шаг 4. Проверка на сервере (PHP):
<?php
$secretKey = 'ВАШ_СЕКРЕТНЫЙ_КЛЮЧ'; // Получите в консоли Яндекс.Облака
$token = $_POST['smart-token'] ?? '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://smartcaptcha.yandexcloud.net/validate');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'secret' => $secretKey,
'token' => $token,
'ip' => $_SERVER['REMOTE_ADDR']
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (!isset($result['status']) || $result['status'] !== 'ok') {
die('Капча не пройдена');
}
?>
Лучше всего использовать сразу два способа: скрытые поля + капчу. Так вы защититесь и от простых, и от умных ботов.
<!-- Полный пример защищённой формы -->
<form method="post" action="/send.php">
<!-- Обычные поля -->
<input type="text" name="name" placeholder="Ваше имя" required>
<input type="email" name="email" placeholder="Email" required>
<textarea name="message" placeholder="Сообщение"></textarea>
<!-- Скрытые поля-ловушки -->
<input type="text" name="url" style="display:none" value="">
<input type="email" name="email2" style="display:none" value="">
<!-- Капча -->
<div id="captcha-container" class="smart-captcha"
data-sitekey="ВАШ_КЛЮЧ"></div>
<input type="hidden" name="smart-token" id="smart-token">
<button type="submit">Отправить</button>
</form>
Комментарии
Пока нет комментариев. Будьте первым!