Рецепт использования Google reCAPTCHA для защиты форм от спама
Один из вариантов защиты в виде чекбокса от Google reCAPTCHA
В примере используется Google reCAPTCHA v2.
Ниже в коде будет приведен пример использования чекбоса. Также есть вариант "невидимой" проверки.
Ссылка на получение api-ключа для использования сервиса Google reCAPTCHA.
Допустим, на сайте есть стандартная связка для отправки заявок с сайта на почту и / или в CRM:
- HTML-форма
- (Не обязательно) какой-то JS скрипт с кастомной валдиацией, который отправляет данные формы на обработчик
- Файл php-обработчика, который тоже каким-то образом проверяет пришедние с формы данные и далее записывает их в БД / CRM / Google-доки / CRM или любой другой сервис.
В данном примере для простоты пропущу второй шаг. Но его наличе ничего принципиально не поменяет.
<!-- в action указан адрес php-обработчика -->
<form
class="form"
id="feedback-form"
method="POST"
action="https://yoursitename.ru/feedbackFormHandler.php"
>
<div class="form__item">
<input pattern="[A-Za-zА-Яа-яЁё ]{2,}" required name="name" type="text"
placeholder="Ваше имя*"
oninvalid="setCustomValidity('Пожалуйста, вводите только буквы.')">
</div>
<div class="form__item">
<textarea name="text" required cols="40" rows="8" placeholder="Ваше сообщение"></textarea>
</div>
<div class="form__item">
<button class="button" type="submit">Отправить</button>
</div>
</div>
Конечно, на стороне php-обработчика нужно делать проверки на наличие запрещенных символов и т.д. Но не помешала бы и защита на фронтенде от ботов, которая бы не позволяла им в принципе сабмитить форму.
Подключаем Google reCaptcha
Прежде всего нужно будет получить уникальный персональный ключ (SITE_KEY) для использования сервисом.
Сделать это можно в админской панели.
Стратегия будет следующей:
- Подчключаем скрипт reCaptcha на страницу
- "Прячем" настоящее значение атрибута
actionв дата атрибут, а на его место ставим заглушку. - Выставляем кнопке
disabled-состояние, чтобы форму нельзя было отправить без проверки - Добавляем в разметку формы код для инициализации чекбокса
- Пара строчек js-скрипта, который отработает при успешной проверке
<!-- Подчключаем скрипт reCaptcha на страницу -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<!-- "Прячем" настоящее значение атрибута `action` в дата атрибут, а на его место ставим заглушку. -->
<form
data-action="https://yoursitename.ru/feedbackFormHandler.php"
action="https://yoursitename.ru/stub"
class="form"
id="feedback-form"
method="POST"
>
<div class="form__item">
<input pattern="[A-Za-zА-Яа-яЁё ]{2,}" required name="name" type="text"
placeholder="Ваше имя*"
oninvalid="setCustomValidity('Пожалуйста, вводите только буквы.')">
</div>
<div class="form__item">
<textarea name="text" required cols="40" rows="8" placeholder="Ваше сообщение"></textarea>
</div>
<div class="form__item">
<!--
Добавляем в разметку формы код для инициализации чекбокса
здесь появится чекбокс
data-sitekey — ваш ключ для использования сервиса
data-callback — скрипт, который будет выполнен при удачной прохождении проверки
он будет описан ниже
-->
<div
class="g-recaptcha"
data-sitekey="SITE_KEY"
data-callback="validationCallback">
</div>
</div>
<!-- Выставляем кнопке disabled, чтобы форму нельзя было отправить без проверки -->
<div class="form__item">
<button disabled class="button" type="submit">Отправить</button>
</div>
</div>
<script>
var form = document.querySelector('#feedback-form');
function validationCallback() {
// подменяем атрибут action на тот, что в дата-атрибуте
form.action = form.dataset.action;
// убираем disabled-атрибут с кнопки отправки
form.querySelector('button[type="submit"]').disabled = false;
}
</script>
Мониторим статистику
Мониторить статистику проверок по вашим сайтом можно в админской панели.
Комментарии