Как бы я защитил API от злоупотреблений? - PullRequest
13 голосов
/ 10 сентября 2009

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

while(true) { 
    Upload();
}

и спам / DoS на сайте.

Мое текущее решение - ограничить все IP-адреса определенным количеством загрузок в день / час. Я считаю, что это будет хорошо работать для настольных приложений, которые будут использовать API, но для веб-сайтов, которые хотят его использовать, все пользователи будут иметь одинаковый IP-адрес (сервер).

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

Что еще можно сделать? Я хотел бы, чтобы все было как можно более открытым, и в то же время иметь возможность запретить пользователям / IP-адресам, которые явно злоупотребляют сервисом.

Ответы [ 7 ]

9 голосов
/ 10 сентября 2009

Если вы не хотите реализовывать учетные записи пользователей, как насчет того, чтобы те, кто хочет использовать API, подписались на ключ / секрет API, который вы можете использовать для ограничения скорости.

4 голосов
/ 10 сентября 2009

Выезд OAuth .

3 голосов
/ 24 октября 2012

Проверьте инструмент управления API с открытым исходным кодом, как apiGrove; apiGrove.net или на GitHub по адресу apigrove.github.com / apigrove . apiGrove поддерживает различные подходы к защите API, включая белый список IP-адресов и авторизацию по ключу.

2 голосов
/ 10 сентября 2009

В одной компании, в которой я работал, мы внедрили регулирование для всех неоплачиваемых клиентов с ограничением определенного числа запросов в день, теоретически настраиваемого для конечной точки API. Если вам нужно было указывать уникальный идентификатор в качестве ключа приложения в каждом запросе, в QueryString для облегченных API или в XML-запросе POST для более сложных API. Для конечных пользователей, не использующих общедоступный API, вместо этого вы можете передать маркер аутентификации.

Если вы предоставляете публичный API, не требуя какой-либо аутентификации или авторизации, вам придется прибегнуть к регулированию на основе IP-адреса. Но нетрудно создать легкую веб-страницу обеспечения, которая позволяет людям подписываться на доступ к API.

Логика вашего приложения может регулироваться на основе количества запросов, как мы, или ежедневной пропускной способности, как это делает Flickr.

0 голосов
/ 15 мая 2019

Для API, разработанных в .NET, вы можете использовать API Protector .NET .

Смотрите этот ответ: https://stackoverflow.com/a/56075128/1679165

0 голосов
/ 01 октября 2009

Как уже упоминалось в этой теме, в таких ситуациях часто используются ключи API. Тот факт, что на вашем сайте нет учетных записей, не имеет значения: ключ API идентифицирует приложение , а не пользователь . (На самом деле, если на вашем сайте есть пользователи, вам нужны отдельные механизмы для идентификации приложения и пользователя в вызове API - вот где OAuth очень полезен).

Если вы не хотите создавать свой собственный процесс регистрации разработчика, процесс выдачи ключа API, код регулирования и т. Д., Я бы посоветовал вам взглянуть на мою компанию, WebServius (www.webservius.com), которая предоставляет размещенный уровень управления API поверх предоставляемого вами API.

0 голосов
/ 10 сентября 2009

Требуется токен для загрузки и ограничение токена CAPTCHA. Код потребления будет выглядеть примерно так:

// 1st request
var uploadToken = api.RequestToken(sessionIdFromUser);
if (uploadToken.RequireChallenge) {
   // requires challenge due to per IP limiting
   // uploadToken.Captcha could be a URL
   DisplayView(uploadToken.Captcha, uploadToken.SessionId); 
   return;
}
api.Upload(uploadToken, captchaFromUser, byte[]);
...