Ограничение скорости API по IP

Я смотрел, как выполняется ограничение скорости, и кажется, что многие API (включая API StackOverflow v1) ограничивают скорость по IP или ограничивают ключи API для использования в определенном домене. Как это сделать надежно?

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

Я хочу сказать: это должно быть возможно, поскольку это делают некоторые известные имена; Как они это делают?


person NickAldwin    schedule 17.03.2013    source источник
comment
Не уверен на 100%, что вы имеете в виду. Они собираются посмотреть на удаленный IP-адрес, являющийся источником запроса. Что вы имеете в виду, что сайт делает запросы?   -  person Anorov    schedule 17.03.2013
comment
Итак, если XHR делает запрос с веб-страницы, они будут ограничивать скорость веб-страницей, а не человеком, посещающим сайт, верно?   -  person NickAldwin    schedule 17.03.2013
comment
Они хотят ограничивать / передавать ключи API на основе приложения, а не пользователей приложения, верно?   -  person NickAldwin    schedule 17.03.2013
comment
Большинство громких имен имеют ключ API и секрет API (если им нужна авторизация) для доступа к методам api. Если вас устраивает такой подход, возможно, вы можете ограничить использование ключа API?   -  person Srikanth Venugopalan    schedule 17.03.2013


Ответы (2)


В сфере мошенничества это называется контролем скорости, а в управлении трафиком это похоже на «формирование трафика». В основном вы разрешаете ограниченное использование за период времени, так что, например, вы можете разрешить только 10 запросов в минуту / IP-адрес.

Для каждого «запроса» определите удаленный адрес (getpeername () в C), эта функция всегда будет IP-адресом удаленного пользователя. Затем просто посчитайте за период времени, как могут обрабатываться запросы, и, если вы превысите лимит, сделайте что угодно. В псевдокоде

Get block for remote ip
If time-now is new window, then reset usage to zero
Add one to usage count
If usage > allowance then .....
Else if usage > allowance*0.75 then slow-down 
Else ok

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

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

Вы, конечно, можете ограничить любой размер по вашему желанию: IP-адрес, ссылку, тип браузера !, pageurl, cookie. Если вы используете getpeername, имейте в виду, что несколько одновременно работающих пользователей могут иметь один и тот же удаленный IP-адрес, если они находятся за общим частным маршрутизатором.

person rlb    schedule 18.03.2013

Вы используете либо удаленный адрес запроса, либо первый IP-адрес в заголовке x-forwarded-for.

Вы используете заголовок только тогда, когда ваше приложение находится за обратным прокси-сервером, которому вы доверяете, или, например, работаете на PaaS. Вам нужно контролировать, скольким уровням вы доверяете. Проверьте реальный IP-адрес модуля nginx.

Использование IP-адреса является очень распространенным шаблоном для анонимного трафика, потому что на данный момент вы ничего не знаете о пользователе. Как только пользователь аутентифицирован (будучи человеком или приложением), лучше использовать его id вместо ip.

person José F. Romaniello    schedule 19.04.2015