Подтвердить что ты не робот

Как защитить API от злоупотреблений?

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

while(true) { 
    Upload();
}

и спам/DoS-сайт.

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Отметьте OAuth.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Требовать, чтобы токен загружался и ограничивал токен 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[]);

Ответ 6

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

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