Как бы я защитил API от злоупотреблений?
Привет всем, я управляю сайтом хостинга изображений и разрабатываю API для него. Меня беспокоит то, что я не хочу, чтобы кто-то мог делать что-то вроде:
while(true) {
Upload();
}
и спам /DoS на сайте.
Мое текущее решение - ограничить все IP-адреса определенным количеством загрузок в день / час. Я считаю, что это будет хорошо работать для настольных приложений, которые будут использовать API, но для веб-сайтов, которые хотят использовать его, все пользователи будут иметь один и тот же IP (сервер).
Я полагаю, что лучшим решением было бы иметь учетные записи пользователей, которые аутентифицируются с помощью API, а затем забанить каждую учетную запись, если они злоупотребляют ею. Проблема в том, что на моем сайте вообще нет учетных записей, все полностью анонимно.
Что еще можно сделать? Я хотел бы держать вещи как можно более открытыми, и в то же время иметь возможность запретить пользователям / IP-адресам, которые явно злоупотребляют сервисом.
6 ответов
Если вы не хотите реализовывать учетные записи пользователей, как насчет того, чтобы те, кто хочет использовать API, подписались на ключ / секрет API, который вы можете использовать для ограничения скорости.
Проверьте инструмент управления API с открытым исходным кодом, такой как apiGrove; apiGrove.net или на GitHub по адресу http://apigrove.github.com/apigrove. apiGrove поддерживает различные подходы к защите API, включая белый список IP-адресов и авторизацию по ключам.
В одной компании, в которой я работал, мы внедрили регулирование для всех неоплачиваемых клиентов с ограничением в определенном количестве запросов в день, теоретически настраиваемым для каждой конечной точки API. Если вам нужно было указывать уникальный идентификатор в качестве ключа приложения в каждом запросе, в QueryString для облегченных API или в XML-запросе POST для более сложных API. Для конечных пользователей, не использующих общедоступный API, вместо этого вы можете передать маркер аутентификации.
Если вы предоставляете общедоступный API без какой-либо аутентификации или авторизации, вам придется прибегнуть к регулированию на основе IP-адреса. Но нетрудно создать легкую веб-страницу обеспечения, которая позволяет людям подписываться на доступ к API.
Логика вашего приложения может регулироваться на основе количества запросов, как мы, или ежедневной пропускной способности, как это делает Flickr.
Как уже упоминалось в этом потоке, в таких ситуациях часто используются ключи API. Тот факт, что на вашем сайте нет учетных записей, не имеет значения: ключ API идентифицирует приложение, а не пользователя. (На самом деле, если на вашем сайте есть пользователи, вам понадобятся отдельные механизмы для идентификации приложения и пользователя в вызове API - вот где OAuth очень полезен).
Если вы не хотите создавать свой собственный процесс регистрации разработчиков, процесс выдачи ключей API, код регулирования и т. Д., Я бы посоветовал вам взглянуть на мою компанию WebServius (www.webservius.com), которая предоставляет размещенный API Уровень управления поверх предоставляемого вами API.
Требовать токен для загрузки и ограничить токен 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[]);
Для API, разработанных в.NET, вы можете использовать API Protector.NET.
См. Этот ответ: /questions/9482515/kak-ogranichit-dos-ataku-s-pomoschyu-web-api/55147999#55147999