Когда владелец панели думает о защите, он думает о внешней атаке: нагрузка, перебор паролей, сканеры уязвимостей. Но у панели с открытым API есть вторая дверь, и выглядит она совершенно легально: запросы приходят с валидным ключом, от вашего же зарегистрированного клиента, и от нормальной работы ничем не отличаются. Разбираем, что реселлер может сделать вашей панели одной строкой curl, какие проверки это останавливают и почему прятать кнопки бесполезно.

Атака, у которой есть ваш ключ

Разница с обычной атакой принципиальная, и от неё зависит всё остальное. Внешнюю отбивают на подступах: фильтр трафика, лимит попыток входа, капча - об этом есть отдельный разбор про безопасность панели. Здесь наоборот: трафик легитимный, ключ настоящий, клиент реальный, и ни один фильтр на входе такой запрос не отклонит.

Злого умысла при этом чаще всего нет. На практике источников три:

Главное правило: интерфейс ничего не защищает

На этом спотыкаются чаще всего. Спрятать кнопку, убрать услугу из витрины, отключить раздел - всё это меняет только то, что видит браузер. Клиент с ключом в браузер не заходит вовсе.

В нашем ядре правило закреплено тремя отдельными серверными проверками, и в комментарии к каждой стоит одна и та же мысль: без неё запрет обходился бы одной строкой curl.

И четвёртое, самое общее. Все проверки заказа - доступность услуги, границы объёма, подтверждение почты, тип услуги, хватает ли денег - должны жить в одном месте, через которое проходят все входы: и форма витрины, и API, и гостевой чекаут. Разводить их по вызывающим нельзя: рано или поздно один вход примет то, что другой отклоняет, и разойдутся они молча.

Фейковые и мусорные заказы

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

Выжигание лимитов

Третий слой самый неприятный, потому что бьёт не по одному клиенту, а по всем сразу. Скрипт, опрашивающий статусы в цикле без пауз, съедает общий бюджет запросов, и вместе с ним встают остальные реселлеры.

Ориентиры по числам. У нас клиентский API ограничен сотней с небольшим запросов в минуту, админский - примерно втрое выше, и это не непоследовательность: клиентским ключом обычно работает человек или небольшой скрипт, а в админский ходит робот и пачками. У панелей на распространённом движке предел ещё жёстче - около пяти запросов в секунду на панель, и наткнуться на него в реальной интеграции проще, чем кажется.

Два следствия, о которых редко думают заранее:

Правильный ответ - не запрет, а пакетные методы и внятная документация: опрос статусов пачкой до сотни номеров решает ту же задачу, что цикл по одному заказу, но в сто раз дешевле для обеих сторон.

Что делать с ключами

Как это вообще увидеть

Главная проблема злоупотребления изнутри в том, что оно не выглядит как проблема: заказы создаются, деньги списываются, панель работает. Минимум, который стоит иметь:

Итог

Открытый API - это не дыра, а главный способ роста панели: реселлер с ключом приносит объём, которого вручную не набрать. Просто защищать его надо не тем, чем защищают сайт. Все правила серверные, все входы проходят через одни и те же проверки, лимиты объявлены заранее, ключ перевыпускается в одно нажатие. Спрятанная кнопка не защищает ничего. Кому и зачем выдавать ключ - в статье про API панели для реселлеров.

Посмотреть, как это работает на живой панели, можно без затрат: заказы через наш собственный каталог не тарифицируются вообще, а по сторонним поставщикам бесплатны первые 100 заказов в месяц. Ключ выдаётся сразу, и прогнать по нему свой скрипт можно в первый же день.