Диагностика проблемы с мошенническими заказами
В интернет-магазинах на 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) | Гарантирует отмену даже если фильтр не сработал | Заказ создаётся, что может нагружать БД и уведомления | Использовать как дополнительный уровень безопасности |
| Использование плагинов антифрода | Готовое решение с поддержкой и обновлениями | Может быть платным, не всегда гибко | Комбинировать с кастомным кодом для специфических задач |