Как избежать злоупотребления REST API? заблокировать много вызовов от одного и того же клиента JAX-RS (Dropwizard)
Не уверен, что я прав, но давайте предположим, что у меня есть REST API и конечная точка, которая, например, создает некоторый ресурс, скажем, @POST
создать пользователя.
Как защитить мое приложение от пользователей, которые делают цикл с примерно 10000 вызовами API для создания бесполезных ресурсов?
Можно ли написать фильтр, который блокирует такое поведение? Я надеюсь, вы понимаете, о чем я.
2 ответа
У вас есть много вариантов:
- блокировать ip, когда определенный ip генерирует много запросов
- блокировка ip+useragent+ другая информация о браузере пользователя
- заблокировать пользователя, используя сопоставление с поведением
- очевидный выбор - скрыть некоторые методы REST за подтверждением по электронной почте (процесс регистрации)
Скажем в псевдокоде ABUSING_ID = md5(ip+useragent)
- у вас может быть что-то вроде системы ценообразования, поэтому каждый вызов API имеет цену (от 0 до 10) и сохраняет каждый ABUSING_ID+ их цену вызова API в базе данных (т.е. на один день). Таким образом, когда общая цена запросов на данный ABUSING_ID превышает пороговое значение, вы блокируете их. (Более формальный и, я уверен, лучший подход - это то, что @ roman-vottner предложил алгоритм Leaky bucket)
Вы можете реализовать эти схемы на разных уровнях системы (на стороне клиента, на стороне балансировки нагрузки / на стороне веб-сервера ( fail2ban), на уровне приложения)
Чем больше уровней вы пройдете, тем лучше.
некоторые новички могут использовать графическую автоматизацию, чтобы щелкнуть внутри вашего пользовательского интерфейса (если он предоставляет ваш API), поэтому вам нужна защита на стороне клиента.
более продвинутые мошенники могут использовать скрипты для скручивания вашего API, вам нужна защита на стороне сервера
другой вид использует что-то вроде phantonjs для эмуляции среды браузера (защита на стороне клиента)
некоторые магнаты знают достаточно, чтобы нанимать дешевых работников, чтобы кликать по вашему сайту / делать запросы с помощью специально созданных инструментов
прокси-серверы / tor / botnets / предотвращение отпечатков пальцев в браузере (в основном, изменение пользовательского агента и других деталей при каждом запросе) и т. д.
Если ваш API интенсивно используется, вы можете начать со сбора статистики - он окупится позже. В худшем случае вам понадобится команда исследователей и программистов данных, чтобы создать работающую, надежную систему предотвращения мошенничества.
Весь мир в войне:-)
PS Я ничего не говорил об авторизованных вызовах API (токены и т. Д.), Потому что авторизованные вызовы API гораздо легче перехватить, здесь речь идет о незащищенных REST-запросах.
PPS Существует еще один показатель, но вы должны рассматривать его как последнее средство: если ваш сервис международный, глобального уровня, но у вас слишком много мошенничества, скажем, из вымышленного мошенничества, и это мошенничество вредит вашему бизнесу больше, чем хороший трафик Чтобы получить прибыль, вы должны заблокировать всю страну и сделать уведомление, чтобы хорошие клиенты из этой страны могли зарегистрироваться по более строгому протоколу.
Я согласен с ответом @ странного Карго. Если вы не хотите реализовывать это самостоятельно, есть несколько служб, которые будут анализировать запросы и рекомендовать, блокировать их или нет, у меня был довольно хороший опыт работы с ShieldSquare