wpcorp.ru wordpress WP Corp

WooCommerce: автоматическое отклонение заказов по IP и User-Agent

Диагностика проблемы: зачем блокировать заказы по IP и User-Agent

В WooCommerce часто возникают ситуации, когда необходимо блокировать подозрительные или мошеннические заказы. Чаще всего это происходит из-за повторных заказов с одного IP или использования подозрительных User-Agent, характерных для скриптов и ботов. Если не фильтровать такие заказы, магазин рискует получить убытки и потери репутации.

Как реализовать автоматическое отклонение заказов по IP и User-Agent

Определение списка запрещённых IP и User-Agent

Для начала нужно сформировать массивы с IP адресами и User-Agent, которые будут автоматически блокироваться. Например:

$blocked_ips = [
    '123.123.123.123',
    '111.222.333.444',
];

$blocked_user_agents = [
    'BadBot',
    'Curl',
    'Python-requests',
];

Добавление фильтра для отклонения заказов при оформлении

Используем хук woocommerce_checkout_process, который запускается при проверке данных заказа перед сохранением. В нём проверим IP и User-Agent и выведем ошибку, если клиент попадает в блок-лист.

add_action('woocommerce_checkout_process', function() use ($blocked_ips, $blocked_user_agents) {
    $client_ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';

    // Проверка IP
    if (in_array($client_ip, $blocked_ips)) {
        wc_add_notice('Ваш IP заблокирован для оформления заказов.', 'error');
    }

    // Проверка User-Agent
    foreach ($blocked_user_agents as $blocked_agent) {
        if (stripos($user_agent, $blocked_agent) !== false) {
            wc_add_notice('Ваш браузер не поддерживается для оформления заказов.', 'error');
            break;
        }
    }
});

Блокировка заказов уже созданных (опционально)

Если хочется автоматически отменять уже созданные заказы от нежелательных IP или User-Agent, можно добавить код, который при смене статуса заказа проверяет эти параметры и ставит статус "отменён".

add_action('woocommerce_thankyou', function($order_id) use ($blocked_ips, $blocked_user_agents) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $client_ip = $order->get_meta('_customer_ip_address');
    $user_agent = $order->get_meta('_customer_user_agent');

    // Проверка IP
    if (in_array($client_ip, $blocked_ips)) {
        $order->update_status('cancelled', 'Заказ автоматически отменён: заблокированный IP');
        return;
    }

    // Проверка User-Agent
    foreach ($blocked_user_agents as $blocked_agent) {
        if (stripos($user_agent, $blocked_agent) !== false) {
            $order->update_status('cancelled', 'Заказ автоматически отменён: заблокированный User-Agent');
            break;
        }
    }
});

Как проверить, что решение работает

  • Попробуйте оформить заказ с заблокированного IP — должен появиться текст ошибки и оформление не завершится.
  • Используйте браузер с User-Agent из списка или эмулятор (например, в DevTools) — оформление заказа заблокируется.
  • Для проверки отменённых заказов — создайте заказ с разрешённого IP, но измените User-Agent на запрещённый, затем посмотрите, изменился ли статус заказа на "отменён" после оформления.

Частые ошибки и как их исправить

  • Проблема: Ошибка не срабатывает у некоторых пользователей.
    Причина: IP может определяться через прокси или CDN, и $_SERVER['REMOTE_ADDR'] не отражает реальный IP.
    Решение: Используйте плагины для определения реального IP или проверяйте заголовки X-Forwarded-For и CF-Connecting-IP.
  • Проблема: Пользователи с мобильных устройств блокируются ошибочно.
    Причина: User-Agent слишком общий и попадает под фильтр.
    Решение: Уточните User-Agent в списке, используйте более точные регулярные выражения или исключения.
  • Проблема: Автоматическая отмена заказа не работает.
    Причина: Метаданные _customer_ip_address и _customer_user_agent отсутствуют.
    Решение: Добавьте сохранение этих данных при оформлении заказа с помощью update_post_meta и хука woocommerce_checkout_update_order_meta.

Практические советы по безопасности и производительности

  • Храните списки блокируемых IP и User-Agent в отдельном конфигурационном файле или используйте фильтры для их динамического обновления.
  • Если список большой, используйте фильтрацию на уровне сервера (например, .htaccess или nginx), чтобы уменьшить нагрузку на PHP и WooCommerce.
  • Для расширенной защиты рассмотрите интеграцию с системами антифрода или сервисами типа Cloudflare, которые умеют блокировать ботов на уровне CDN.

Чек-лист внедрения автоматического отклонения заказов

  1. Собрать список запрещённых IP и User-Agent.
  2. Добавить проверку в woocommerce_checkout_process с выводом ошибок.
  3. При необходимости реализовать автоматическую отмену уже созданных заказов.
  4. Проверить работу на тестовом заказе с запрещёнными параметрами.
  5. Отладить выявленные ошибки и уточнить списки блокировки.
  6. Оптимизировать хранение и проверку списков для производительности.

Сравнение подходов блокировки заказов

МетодПлюсыМинусыПример использования
PHP-хук woocommerce_checkout_processПростота реализации, проверка до создания заказаНе защищает от заказов, созданных альтернативными способамиКод из статьи
Автоматическая отмена после создания заказаПозволяет отсеять уже созданные заказыЗадержка, заказ появляется в админкеХук woocommerce_thankyou
Блокировка на уровне сервера (nginx, .htaccess)Самый быстрый способ, снижает нагрузкуМенее гибкий, требует админдоступа к серверуПравила deny по IP
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее