Диагностика проблемы: зачем блокировать заказы по 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.
Чек-лист внедрения автоматического отклонения заказов
- Собрать список запрещённых IP и User-Agent.
- Добавить проверку в
woocommerce_checkout_processс выводом ошибок. - При необходимости реализовать автоматическую отмену уже созданных заказов.
- Проверить работу на тестовом заказе с запрещёнными параметрами.
- Отладить выявленные ошибки и уточнить списки блокировки.
- Оптимизировать хранение и проверку списков для производительности.
Сравнение подходов блокировки заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
PHP-хук woocommerce_checkout_process | Простота реализации, проверка до создания заказа | Не защищает от заказов, созданных альтернативными способами | Код из статьи |
| Автоматическая отмена после создания заказа | Позволяет отсеять уже созданные заказы | Задержка, заказ появляется в админке | Хук woocommerce_thankyou |
| Блокировка на уровне сервера (nginx, .htaccess) | Самый быстрый способ, снижает нагрузку | Менее гибкий, требует админдоступа к серверу | Правила deny по IP |