К содержимому
DDoS·Protect
Платформы

OpenCart: защита магазина, админки и поиска

OpenCart и его русская сборка ocStore — частый выбор для небольших магазинов. Маршрутизация через параметр route усложняет правила: почти все запросы идут на один index.php, и защищать нужно не пути, а значения параметра. При включённых ЧПУ те же действия доступны и по «красивым» адресам, поэтому правила должны покрывать обе формы.

Правила по route

Значение routeЧто этоПравило
product/searchПоиск по названиям и описаниям — тяжёлый запрос к базеЛимит на сессию, проверка для подозрительных источников
product/category с filter, sort, limitКатегории с фильтрами и сортировкойБелый список параметров, отбрасывание неизвестных при кэшировании
checkout/cart и добавление в корзинуКорзина и AJAX-запросы добавленияЛимиты, без кэша
checkout/checkoutОформление заказаПроверка браузера для подозрительных источников, без кэша
account/login, account/register, account/forgottenВход, регистрация, восстановление пароляЛимиты на попытки и на отправку писем
information/contactФорма обратной связиЛимит на отправку, защита от спама

В последних версиях OpenCart 4 метод контроллера отделяется точкой (checkout/cart.add), в 3.x — косой чертой (checkout/cart/add). Сопоставляйте правило с началом значения route, чтобы оно срабатывало в обеих версиях.

# контекст http
map $arg_route $oc_search_key {
    default             "";
    ~^product/search    $binary_remote_addr;
}
limit_req_zone $oc_search_key zone=oc_search:10m rate=20r/m;

# контекст server
location = /index.php {
    limit_req zone=oc_search burst=10 nodelay;
    # далее fastcgi_pass и остальные директивы PHP
}
Дополнительный лимит на поиск в nginx: запросы с пустым ключом (не поиск) не учитываются

Административная панель

Папку администратора лучше переименовать — вместе с путями в admin/config.php — и закрыть доступом по адресам. Стандартный /admin/ сканеры проверяют первым делом. Если доступ по адресам невозможен, включите проверку браузера и лимит попыток для входа route=common/login.

Реальный IP посетителя

OpenCart записывает в заказ и историю входов адрес из REMOTE_ADDR, а заголовки X-Forwarded-For и Client-IP сохраняет отдельно, как «forwarded IP». Поэтому настраивать нужно веб-сервер: real_ip в nginx или mod_remoteip в Apache с доверием только к адресам фильтра. Тогда антифрод-модули и проверка заказов будут работать с настоящими адресами, а не с адресом узла фильтрации. См. инструкцию для nginx.

Что исключить из проверки браузера

  • Callback-и платёжных модулей (route вида extension/payment/…/callback, точный путь зависит от модуля) — их вызывает сервер платёжной системы.
  • Модули обмена с 1С и МойСклад — исключение по адресам серверов обмена.
  • Фиды для Яндекс Маркета, Google Merchant и маркетплейсов.
  • Задачи по расписанию, если модули запускают их HTTP-запросом.

Типичные ошибки

  • Правило поставлено на /index.php целиком — под лимит попадает весь магазин, а не только поиск.
  • Кэшируются ответы с cookie сессии OCSESSID — у покупателей путаются корзины.
  • После установки не удалена папка install/ — её ищут по стандартному пути.

Вопросы и ответы

Как защитить фильтр ocFilter или аналогичный модуль?

Фильтры добавляют свои параметры к route=product/category. Внесите их в белый список, а остальные параметры отбрасывайте при формировании ключа кэша — тогда случайные значения не будут проходить до сервера. Подробнее — в статье об обходе кэша.

Нужно ли защищать ЧПУ-адреса отдельно?

Да. С модулем SEO URL поиск и категории доступны по «красивым» адресам, которые OpenCart внутри превращает в тот же route. Правило должно учитывать обе формы адреса.

Не помешает ли проверка браузера оплате?

Нет, если callback-адреса платёжных модулей внесены в исключения. Перед подключением составьте их список по установленным модулям оплаты.

Ранний доступ

Подключим ваш сайт одним из первых

Сервис готовится к запуску. Оставьте заявку: проверим, от чего нужно защищать ваш проект, и подключим его в числе первых на условиях раннего доступа.