2009-09-10 5 views
12

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

while(true) { 
    Upload(); 
} 

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

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

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

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

+0

Возможно, ваши сторонние сайты-партнеры могут украсить запрос исходным IP-адресом, например HTTP-заголовок X_FORWARDED_FOR? –

+0

Возможно, функции анти-DoS встроены в (настраиваемый) веб-сервер и, следовательно, не должны быть в веб-приложении? – ChrisW

+0

ChrisW: Нет, DoS может возникать на нескольких уровнях приложения; скажем, блокировать все учетные записи пользователей и т. д. На этом уровне необходимо обслуживать. –

ответ

9

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

+1

+1 для ключей API. – LiraNuna

+0

LiraNuna: Предлагаю вам также заглянуть в OAuth. Это спецификация для работы со всем этим (ключи API и т. Д.) Правильно. –

+0

OAuth - это способ реализации ключей API. Поскольку ОП не просил услугу сделать это за него, но идея о том, как управлять им, я считаю, что это лучший ответ. – LiraNuna

2

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

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

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

0

Требовать токен для загрузки и ограничения маркера с помощью 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[]); 
1

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

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

3

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

Смежные вопросы