Защита форм с внедрением Hcaptcha

Вы можете использовать Auth/Hcaptcha.php на любых своих формах записывая неудачные попытки на единицу времени и вызывая капчу лишь после их определенного количества. Определяющие логику попыток константы увидите в коде класса.

Для примера разберем форму авторизации: api/modal/system/authorization/sign-in.php

и её обработчик: api/action/system/authorization/sign-in.php

В форме добавляется скрытое поле

<input type="hidden" name="h-captcha-response">

Но пока доступен лимит попыток данному IP, токен не генерируется и не отправляется с формой, поле остается пустым

Окно с формой также содержит callback функцию verifyCallback, для заполнения этого поля и submit-а, которая так же не используется, до момента пока доступны попытки

window.verifyCallback = function(token) {
$("#<?= $basename ?> input[name=h-captcha-response]").val(token);
$("#hcaptcha").modal("hide");
$("#<?= $basename ?> form").submit();
$("#<?= $basename ?> input[name=h-captcha-response]").val("");
}

В обработчике при каждой неудачной попытке, происходит её запись(IP и время пишется классом)

Wrong\Auth\Hcaptcha::attempt(); // запись попытки

Каждый раз обработчик проверяет доступное число попыток условием, и отвечает фронтенду соответствующей ошибкой, если попытки закончились или токен неверный

if (!Wrong\Auth\Hcaptcha::check() && (empty($_POST['h-captcha-response']) || !Wrong\Auth\Hcaptcha::get($_POST['h-captcha-response']))) {
exit(json_encode(['error' => 'hcaptcha']));
}
$_POST['groups']
Definition: add-action.php:16
if(($dbh=Connect::getInstance(true) ->dbh) && $dbh->query("SHOW TABLES") ->fetchAll() && $dbh->query("SELECT COUNT(*) FROM `users`") ->fetchColumn()) if(!empty($_POST)) exit
Definition: install.php:198

Поймав такой ответ, фронтенд вызывает модальное окно с капчей api/modal/system/authorization/hcaptcha.php поверх окна авторизации

if (response.error == 'hcaptcha') {
_modal("#hcaptcha");
}

В модальном окне с капчей вызывается её рендеринг window.hcaptchaRender с нашим коллбеком window.verifyCallback

После ввода капчи и заполнения hidden поля ключем происходит автоматический submit нашей формы и её отправка на обработчик.

В случае успешной проверки токена, обработчик пропускает дальше логику, либо вновь возвращает ответ

exit(json_encode(['error' => 'hcaptcha']));

вызывающий очередной рендеринг Hcaptcha

Заметки
На локальном сервере под ip 127.0.0.1 работу капчи вы не увидите, поскольку в методе check() класса Auth/Hcaptcha.php прописано соответсвующее условие, делающее проверку с этим ip всегда валидной.

Формы регистрации, авторизации, восстановления пароля, подтверждения почты, защищены по умолчанию, лимит - 5 попыток с одного IP в час.