WooCommerce REST API: настройка авторизации по IP для обработки заказов

Диагностика проблемы: зачем нужна авторизация по IP в WooCommerce REST API

При автоматической обработке заказов через WooCommerce REST API часто возникает задача ограничить доступ к API по IP-адресам, чтобы избежать несанкционированных вызовов и повысить безопасность. Особенно актуально, когда интеграция происходит с внутренними сервисами или проверенными партнёрами, которым можно доверять по IP.

По умолчанию WooCommerce REST API использует ключи потребителей (Consumer Key и Consumer Secret), но при компрометации ключей или утечке токенов этого может быть недостаточно. Добавление фильтрации по IP снижает риск злоупотреблений.

Как реализовать фильтрацию по IP для WooCommerce REST API

Шаг 1. Получение IP клиента

Первым делом, нужно корректно получить IP-адрес клиента, который обращается к REST API. В WordPress это можно сделать через глобальный массив $_SERVER с учётом прокси и CDN.

function get_client_ip() {
    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        $ip = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] )[0];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return trim( $ip );
}

Шаг 2. Ограничение доступа по IP в REST API

Добавляем фильтр в WordPress, который проверяет IP перед выполнением REST API-запроса. Если IP не входит в белый список, возвращаем ошибку 403.

add_filter( 'rest_pre_dispatch', function( $response, $server, $request ) {
    // Белый список IP
    $allowed_ips = [
        '123.45.67.89', // IP сервера интеграции
        '98.76.54.32',  // Второй разрешённый IP
    ];

    $client_ip = get_client_ip();

    if ( ! in_array( $client_ip, $allowed_ips, true ) ) {
        return new WP_Error( 'rest_forbidden', 'Доступ к API разрешён только с доверенных IP.', ['status' => 403] );
    }

    return $response;
}, 10, 3 );

Шаг 3. Ограничение по маршрутам (опционально)

Если нужно применять ограничение только к REST API WooCommerce (маршруты начинаются с /wc/v3/), добавьте проверку пути:

add_filter( 'rest_pre_dispatch', function( $response, $server, $request ) {
    $route = $request->get_route();
    if ( strpos( $route, '/wc/v3/' ) === 0 ) {
        $allowed_ips = [ '123.45.67.89', '98.76.54.32' ];
        $client_ip = get_client_ip();
        if ( ! in_array( $client_ip, $allowed_ips, true ) ) {
            return new WP_Error( 'rest_forbidden', 'Доступ к WooCommerce API разрешён только с доверенных IP.', ['status' => 403] );
        }
    }
    return $response;
}, 10, 3 );

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

Чтобы проверить, что фильтрация по IP работает:

  • Сделайте REST API запрос с разрешённого IP — запрос должен успешно пройти (например, получить список заказов).
  • Повторите запрос с IP, которого нет в белом списке — должна вернуться ошибка 403 с сообщением о запрете доступа.

Пример запроса через curl с нужным IP можно протестировать, изменив сетевые настройки или используя VPN:

curl -X GET https://example.com/wp-json/wc/v3/orders \
  -u consumer_key:consumer_secret

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

  • Неправильный IP клиента: если сайт за прокси или CDN, $_SERVER['REMOTE_ADDR'] может возвращать IP прокси, а не реального клиента. В этом случае используйте правильный заголовок HTTP_X_FORWARDED_FOR или настройте сервер на передачу реального IP.
  • Отсутствие фильтрации по маршруту: если фильтр применяется ко всем REST API, можно случайно заблокировать другие интеграции. Добавляйте проверку пути маршрута.
  • Кеширование: если на сайте работает кеширование на уровне сервера (nginx, varnish) или плагина, ошибки 403 могут не показываться корректно. Проверьте настройки кеша.
  • Неправильный формат IP в белом списке: IP должен быть в точном формате, без пробелов, CIDR-диапазоны не поддерживаются в базовом примере.

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

  • Используйте HTTPS для всех запросов к REST API — чтобы предотвратить перехват ключей и данных.
  • Комбинируйте авторизацию по IP с ключами Consumer Key и Secret — двойной уровень защиты.
  • Обновляйте белый список IP централизованно — например, храните их в опциях WordPress и кешируйте для быстрого доступа.
  • Логируйте неудачные попытки доступа — используйте action rest_api_init для записи попыток с неразрешённых IP.
  • Минимизируйте нагрузку на сервер — ограничение по IP уменьшает количество запросов, которые требуют сложной обработки.

Сравнение вариантов реализации фильтрации IP в WooCommerce REST API

МетодПлюсыМинусы
Фильтр rest_pre_dispatch в WordPressПростота реализации, гибкость, работает на уровне WPОбрабатывается уже после запуска WP, влияет на производительность при большом трафике
Настройка на уровне веб-сервера (nginx, Apache)Максимальная производительность, блокировка до загрузки PHPМенее гибко, сложнее масштабировать и менять без доступа к серверу
Плагин безопасности с фильтрацией IPИнтегрировано с другими мерами безопасности, удобный интерфейсМожет нагружать сайт, зависит от качества плагина

Шаблоны для WP Плагины для WP