reCAPTCHA v2 такая в прошлом году ...

Из новостей о ботах, я думаю, вы знаете, что в Laravel уже есть способ остановить ботов, используя дроссель для неудачных попыток входа в систему. Обычно этого достаточно для любого простого приложения, поскольку большая часть тяжелой логики приложения находится под авторизованным пользователем.

Теперь давайте добавим несколько форм, которые должны работать без входа в систему, и теперь у нас возникла проблема. Как мы можем проверить, что он был заполнен человеком, а не роботом, кроме текста «V14GR4 D1SC0UNT»?

Введите reCAPTCHA v3.

Как работает reCAPTCHA v3?

Ускоренный курс reCAPTCHA v3.

reCAPTCHA v3 работает за кулисами. JavaScript генерирует ключ, который идентифицирует взаимодействие, такое как движения мыши или состояние браузера. Этот же сценарий отправляет эту информацию на серверы reCAPTCHA, которые вычисляют вероятность того, что это сделает человек или робот, вместо того, чтобы использовать поле reCAPTCHA, которое пользователь заполняет вручную.

Как только запрос получен вашим приложением, оно использует ключ, полученный вместе с данными, чтобы запросить серверы reCAPTCHA о взаимодействии. Вы можете делать что угодно с этой информацией.

Например, если порог высокий, вы можете обработать форму, как будто она ничего не стоит. Если было мало, вы можете добавить дополнительный шаг, например, отправить электронное письмо для завершения обработки.

Вы можете проверить демонстрацию в Google’s Appspot.

Использование reCAPTCHA v3

Официальный клиент PHP для reCAPTCHA v3 доступен в Packagist, поэтому нет необходимости создавать свой собственный. Просто скажите Composer установить его в свой проект.

composer require google/recaptcha "^1.2"

Есть еще инструкция по настройке, но все можно резюмировать всего в несколько строк. Вы можете просто использовать reCAPTCHA внутри вашего контроллера или (надеюсь) промежуточного программного обеспечения:

public function contactForm(Request $request)
{
    // Validate...
    $response = (new \ReCaptcha\ReCaptcha($secret))
        ->setExpectedAction('contact_form')
        ->verify($request->input('_recaptcha'), $request->ip());

    if (!$response->isSuccess()) {
        abort();
    }
    if ($response->getScore() < 0.6) {
      return response()->view('challenge');
    }
    return response()->view('success');
}

Суть

Во-первых, у вас должен быть секрет для использования сервиса. Получив его из интерфейса администратора для v3, вы помещаете его в качестве параметра для экземпляра класса ReCaptcha. Этот класс отвечает за связь с серверами reCAPTCHA.

Я бы предпочел способ, совместимый с PSR-18, чтобы вы могли использовать Guzzle или любой другой HTTP-клиент по вашему выбору, но, по крайней мере, они предлагают несколько способов для доступа к серверам reCAPTCHA.

Затем вы проверяете имя ключа ввода, который вы используете для получения токена reCAPTCHA. Вы можете использовать g_recaptcha, _recaptcha, recaptcha_token, что угодно из вашей формы, пока вы можете получить это.

Метод isSuccess() проверяет, успешен ли ответ на reCAPTCHA. В противном случае вам следует полностью отказаться от запроса, поскольку кто-то или что-то изменяет запрос.

Затем метод getScore() позволяет проверить, превышает ли оценка порогового значения. Когда порог слишком низкий, он, вероятно, был заполнен роботом, поэтому вы можете принять некоторые контрмеры, чтобы гарантировать, что, если это действительно был человек, замаскированный под робота, все еще мог обработать Запрос. Например, вы можете отправить электронное письмо или добавить задачу как случайный вопрос.

Вот и все. Другие методы предназначены для более строгой проверки и аналитики, которые вам следует полностью использовать, если вы ожидаете появления роботов на своем сайте.

Кстати, Я сам это реализовал. Он работает как промежуточное ПО, поэтому не загромождает ваши контроллеры. Дайте ему шанс, если хотите, чтобы что-то работало нестандартно.