Ответ 1
Если вы не хотите внедрять учетные записи пользователей, как насчет того, чтобы те, кто хочет использовать api, подписываются на ключ/секрет api, который вы можете использовать для ограничения скорости с помощью.
Привет всем, я запустил сайт для хостинга изображений, и я разрабатываю для него API. Меня беспокоит то, что я не хочу, чтобы кто-то мог сделать что-то вроде:
while(true) {
Upload();
}
и спам/DoS-сайт.
Мое текущее решение - ограничить все IP-адреса определенным количеством загрузок в день/час. Я считаю, что это отлично подходит для настольных приложений, которые будут использовать API, но для веб-сайтов, которые хотят его использовать, все пользователи будут иметь один и тот же IP-адрес (сервер).
Я полагаю, лучшим решением было бы иметь учетные записи пользователей, которые аутентифицируются с помощью API, а затем запретить каждую учетную запись, если они будут ее нарушать. Проблема в том, что у моего сайта нет учетных записей пользователей, все это полностью анонимно.
Что еще можно сделать? Я хотел бы держать все как можно более открытым, и в то же время иметь возможность запрещать пользователей/IP-адреса, которые явно злоупотребляют службой.
Если вы не хотите внедрять учетные записи пользователей, как насчет того, чтобы те, кто хочет использовать api, подписываются на ключ/секрет api, который вы можете использовать для ограничения скорости с помощью.
Отметьте OAuth.
Посмотрите инструмент управления API с открытым исходным кодом, например apiGrove; apiGrove.net или на GitHub в apigrove.github.com/apigrove. apiGrove поддерживает различные подходы к защите API, включая белый список IP и авторизацию по ключу.
В одной компании, в которой я работал, мы внедрили дросселирование для всех неплатежеспособных клиентов с ограничением определенного количества запросов в день, теоретически настраиваемым для каждой конечной точки API. Если вам нужно было предоставить уникальный идентификатор в качестве вашего ключа приложения в каждом запросе, в QueryString для облегченных API или в запросе XML запроса POST для более сложных API. Для конечных пользователей, не использующих общедоступный API, вы можете передать токен аутентификации.
Если вы предоставляете публичный API, не требуя какой-либо проверки подлинности или авторизации, вам придется прибегать к регулированию на основе IP-адреса. Но создать небольшую подготовительную веб-страницу, которая позволяет людям зарегистрироваться для доступа к API, не сложно.
Логика вашего приложения может дросселироваться на основе количества запросов, как и мы, или ежедневной полосы пропускания, например, Flickr.
Требовать, чтобы токен загружался и ограничивал токен 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 часто бывают в таких ситуациях. Тот факт, что ваш сайт не имеет учетных записей, не имеет значения: ключ API идентифицирует приложение, а не пользователя. (Фактически, если на вашем сайте есть пользователи, вам понадобятся отдельные механизмы для идентификации приложения и пользователя в вызове API - здесь OAuth очень полезен).
Если вы не хотите создавать свой собственный процесс регистрации разработчиков, процесс выдачи ключей API, код дросселирования и т.д., я хотел бы призвать вас взглянуть на мою компанию WebServius (www.webservius.com), которая обеспечивает размещенный интерфейс управления API поверх API, который вы предоставляете.
Для API, разработанных в .NET, вы можете использовать API Protector.NET.
Смотрите этот ответ: fooobar.com/info/1171567/...