ворд-пресс.рф
Решение

Как добавить Yandex SmartCaptcha в собственную форму WordPress

Интеграция невидимой капчи Яндекса в PHP-формы, пользовательскую авторизацию и AJAX: рендер виджета и обязательная серверная проверка токена.

Если форма создаётся собственной темой, плагином авторизации или другой нестандартной системой, одного виджета недостаточно. Нужно вывести Yandex SmartCaptcha внутри формы, а затем проверить полученный токен на сервере WordPress до сохранения данных или отправки письма.

Yandex SmartCaptcha AntiSpam предоставляет для этого PHP-интерфейс. Ниже — пример для разработчика WordPress.

Плагин · Базовая установка · Исходники на GitHub

Что поддерживается автоматически

Стандартные WordPress-формы комментариев, регистрации, восстановления пароля и опционально входа через wp-login.php подключаются через хуки плагина. Для формы, которая обрабатывается отдельным PHP-кодом, AJAX или REST API, автоматическая защита не гарантируется.

Интеграция требует двух точек: HTML-форма и обработчик POST.

1. Выведите SmartCaptcha в HTML-форме

В PHP-шаблоне вашей формы добавьте вызов действия плагина:

<?php do_action('ysca_render', 'contact'); ?>

contact — произвольный идентификатор контекста. Для разных форм используйте стабильные уникальные значения: contact, registration, customer-feedback.

Рендер должен находиться в той же HTML-форме, которая отправляет данные, чтобы токен был передан обработчику.

Вызов не заменяет проверку токена: без серверного шага злоумышленник сможет отправить данные в обход интерфейса.

2. Проверяйте токен до выполнения действия

В обработчике, куда приходит POST-запрос, вызовите:

$result = function_exists('ysca_verify_custom')
    ? ysca_verify_custom('contact')
    : new WP_Error('captcha_missing', 'Проверка недоступна');

if (is_wp_error($result)) {
    wp_die(
        esc_html($result->get_error_message()),
        'Проверка формы',
        array('response' => 403)
    );
}

// Только после успешной проверки:
// - сохраняйте запись в базе
// - отправляйте письмо
// - создавайте пользователя

Используйте одинаковый контекст в do_action и ysca_verify_custom. Проверка должна выполняться раньше операций, которые нельзя откатить.

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

3. Подключение к собственному плагину авторизации

Если сайт использует собственную форму регистрации и входа, то вызовы должны быть встроены непосредственно в её HTML и обработчики. Не полагайтесь на фильтры authenticate и registration_errors, если пользователь проходит не через стандартный поток wp-login.php.

В контекстах можно использовать, например, custom-login и custom-registration. Убедитесь, что проверка серверного токена проходит до вызова wp_signon() или wp_create_user().

Важно: капча не заменяет nonce, ограничение попыток входа, проверки прав, валидацию полей и защиту от перебора паролей.

4. AJAX и REST: особенности

Для AJAX и REST не следует механически копировать пример с wp_die(). Вместо него возвращайте обработанный JSON-ответ со статусом 403 и не выполняйте основное действие при ошибке проверки.

Проверьте, что клиентский JavaScript получает токен и передаёт его в составе того запроса, в котором сервер вызывает ysca_verify_custom(). Если форма отправляет fetch с JSON, может потребоваться адаптер, так как базовый метод v1.0.0 ожидает стандартные параметры POST. Для такой формы нужно проверить код обработчика и при необходимости реализовать преобразование до вызова API.

Плагин не заявляет готовых коннекторов для Contact Form 7, Elementor Forms, WooCommerce или WPForms: совместимость требует отдельной проверки.

5. Проверьте интеграцию

  • Попробуйте отправку без токена: запись, письмо или регистрация не должны выполняться.
  • Проверьте обычный успешный сценарий с корректным токеном.
  • Проверьте повторные отправки для того же контекста и IP.
  • На тестовом сайте временно отключите JavaScript: защищённое действие должно быть отклонено.
  • Проверьте отключение плагина, API-сбой и отсутствие серверного ключа — обработчик не должен обходить свою собственную проверку без явно принятого решения.

6. Дополнительные меры безопасности

Капча не является универсальным антиспам-фильтром. Вместе с ней используйте валидацию полей, ограничение частоты, контроль прав, одноразовые nonce для подходящих действий и настройку доверенных прокси. Не добавляйте серверный ключ ysc2_… в HTML или JavaScript.

Для нестандартной формы не достаточно просто скопировать HTML виджета — токен должен пройти проверку в API Яндекса с серверной стороны.

Ссылки

Источник: https://github.com/noice-man/wp-yandex-smartcaptcha-antispam

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.