wpcorp.ru wordpress WP Corp

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

Диагностика проблемы с мошенническими заказами

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

Чтобы выявить проблему, необходимо проанализировать логи заказов и определить повторяющиеся IP и подозрительные User-Agent строки. Для этого можно использовать SQL-запрос в базе данных WordPress, например:

SELECT meta_value AS ip_address, COUNT(*) AS order_count
FROM wp_postmeta
WHERE meta_key = '_customer_ip_address'
GROUP BY meta_value
ORDER BY order_count DESC
LIMIT 10;

Аналогично для User-Agent (если его сохранять в метаданных заказа):

SELECT meta_value AS user_agent, COUNT(*) AS order_count
FROM wp_postmeta
WHERE meta_key = '_customer_user_agent'
GROUP BY meta_value
ORDER BY order_count DESC
LIMIT 10;

Если такие повторы есть, стоит настроить автоматическое отклонение заказов.

Пошаговое решение: отклонение заказов по IP и User-Agent

1. Добавление сохранения User-Agent в заказ

По умолчанию WooCommerce сохраняет IP покупателя, но User-Agent нет. Добавим сохранение User-Agent в метаданные заказа.

add_action('woocommerce_checkout_create_order', 'save_user_agent_in_order_meta', 20, 2);
function save_user_agent_in_order_meta($order, $data) {
    if (!empty($_SERVER['HTTP_USER_AGENT'])) {
        $order->update_meta_data('_customer_user_agent', sanitize_text_field(wp_unslash($_SERVER['HTTP_USER_AGENT'])));
    }
}

2. Настройка фильтра для отклонения заказов

Используем хук woocommerce_checkout_process для проверки IP и User-Agent во время оформления заказа. Если они попадают в черный список — отклоняем оформление.

function reject_order_by_ip_and_user_agent() {
    $blacklist_ips = array('192.168.1.1', '203.0.113.45'); // замените на реальные IP
    $blacklist_user_agents = array('BadBot', 'SpamBot'); // подстроки User-Agent для блокировки

    $user_ip = WC_Geolocation::get_ip_address();
    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_USER_AGENT'])) : '';

    if (in_array($user_ip, $blacklist_ips)) {
        wc_add_notice('Заказы с вашего IP временно заблокированы.', 'error');
        return;
    }

    foreach ($blacklist_user_agents as $blocked_ua) {
        if (stripos($user_agent, $blocked_ua) !== false) {
            wc_add_notice('Заказы с вашим браузером заблокированы.', 'error');
            return;
        }
    }
}
add_action('woocommerce_checkout_process', 'reject_order_by_ip_and_user_agent');

3. Автоматическое отменение заказов после оформления

Если нужно не только запретить оформление, но и отменять уже созданные заказы, добавьте код для смены статуса заказа:

add_action('woocommerce_thankyou', 'auto_cancel_order_by_ip_and_user_agent');
function auto_cancel_order_by_ip_and_user_agent($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    $user_ip = $order->get_meta('_customer_ip_address');
    $user_agent = $order->get_meta('_customer_user_agent');

    $blacklist_ips = array('192.168.1.1', '203.0.113.45');
    $blacklist_user_agents = array('BadBot', 'SpamBot');

    if (in_array($user_ip, $blacklist_ips)) {
        $order->update_status('cancelled', 'Автоматическое отклонение по IP');
        return;
    }
    foreach ($blacklist_user_agents as $blocked_ua) {
        if (stripos($user_agent, $blocked_ua) !== false) {
            $order->update_status('cancelled', 'Автоматическое отклонение по User-Agent');
            return;
        }
    }
}

Проверка результата после внедрения

  • Попробуйте оформить заказ с IP из черного списка — оформление должно быть заблокировано с сообщением об ошибке.
  • Попробуйте оформить заказ с User-Agent, включённым в черный список (можно изменить User-Agent в браузере через расширения) — оформление также будет заблокировано.
  • Если заказ оформлен, но IP или User-Agent есть в черном списке, то после оформления статус заказа должен автоматически стать Отменён.
  • Проверьте метаданные заказа на предмет сохранения User-Agent — через wp-admin или запросом к базе (таблица wp_postmeta).

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

  • Ошибка: Заказы не блокируются — хук woocommerce_checkout_process не срабатывает.
    Причина: Возможно, конфликт с другим плагином, который влияет на процесс оформления заказа. Проверьте последовательность подключений и отключите временно другие плагины для диагностики.
  • Ошибка: User-Agent не сохраняется в заказ.
    Причина: Не вызван хук woocommerce_checkout_create_order или неправильный приоритет. Проверьте, что функция добавлена в functions.php или в плагине с приоритетом не выше 20.
  • Ошибка: IP адрес не определяется корректно.
    Причина: WooCommerce использует собственный метод WC_Geolocation::get_ip_address(), который может давать ошибочный результат за прокси. Проверьте переменные $_SERVER['REMOTE_ADDR'] и $_SERVER['HTTP_X_FORWARDED_FOR'] для диагностики.

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

  • Регулярно обновляйте списки заблокированных IP и User-Agent, чтобы не блокировать легитимных клиентов.
  • Для сложных сценариев используйте сторонние сервисы по анализу IP и трафика (например, Cloudflare, Sucuri) для автоматической фильтрации.
  • Избегайте слишком длинных списков в коде — вынесите их в отдельный файл или настройте через админку с помощью плагина (например, Custom Settings API).
  • Для улучшения производительности не сохраняйте User-Agent, если не планируете его использовать для аналитики или фильтрации.

Сравнение вариантов реализации

МетодПлюсыМинусыКомпромисс
Фильтрация на этапе оформления (woocommerce_checkout_process)Блокирует заказ до создания, экономит ресурсыМожет конфликтовать с другими плагинами, сложнее отладкаИспользовать вместе с логированием для диагностики
Автоматическое отменение после оформления (woocommerce_thankyou)Гарантирует отмену даже если фильтр не сработалЗаказ создаётся, что может нагружать БД и уведомленияИспользовать как дополнительный уровень безопасности
Использование плагинов антифродаГотовое решение с поддержкой и обновлениямиМожет быть платным, не всегда гибкоКомбинировать с кастомным кодом для специфических задач
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙