Как ограничить AJAX API от нежелательного использования (например, кто-то выполняет SELECT *) - PullRequest
8 голосов
/ 13 октября 2009

У меня есть веб-приложение для поиска ресторанов, которое объединяет расположение ресторанов и Карты Google.

Я использую ползунки JQuery, чтобы ограничить количество ресторанов, отображаемых на карте, с помощью фильтра поиска, например: цена, тип еды, локаль.

Эти ползунки JQuery вызывают через AJAX API-интерфейс, который я создал для обновления карты без обновления веб-страницы.

JQuery вызывает RESTFUL API следующим образом:

http://example.com/search/?city=NYC&max-price:50&cuisine=french

Возвращает строку ресторанов JSON, которые соответствуют этому критерию, так что мое веб-приложение может отображать на карте все рестораны, которые соответствуют запросу.

То, чего я не хочу, это чтобы кто-то пришел и выяснил мой API и выкинул ВСЕ списки моих ресторанов.

Есть ли способ, которым я могу ограничить, кто вызывает вышеупомянутый HTTP API, так что только мой веб-сервер вызывает URL, а не спамер / хакеры, желающие сбросить мою базу данных?

Спасибо

Ответы [ 2 ]

10 голосов
/ 13 октября 2009

Сначала заявите о своих намерениях в robots.txt.

Затем отправьте заголовок Set-Cookie с одноразовым номером или каким-то уникальным идентификатором на главной странице, но не в ваших ответах API. Если файл cookie никогда не отправляется на вашу конечную точку API, верните ответ 401 Bad Request, потому что это бот, очень сломанный браузер или кто-то отклоняет ваши файлы cookie. Заголовок Referer также можно использовать в качестве дополнительной проверки, но подделать его тривиально. Отслеживайте, сколько вызовов API было сделано с этим идентификатором. Вы также можете сопоставить идентификаторы с IP-адресами. Если оно превысит ваш порог, ответьте ответом 403 Forbidden. Сделайте свой порог достаточно высоким, чтобы законные пользователи не попали под него.

Ведите хорошие журналы и выделите ответы 401 и 403.

Реально, если кто-то определится достаточно, он сможет сбросить эту информацию. Ваша цель не должна состоять в том, чтобы сделать это невозможным, потому что вы никогда не добьетесь успеха. (См. Все обычные изречения о достижении идеальной безопасности.) Вместо этого вы хотите совершенно четко заявить, что:

  • Такое поведение нарушает условия обслуживания.
  • Вы активно пытаетесь предотвратить это.
  • Вы знаете, что преступник существует и примерно кто он.
  • Страшные адвокаты могут начать вмешиваться, если это продолжится.

(у вас есть адвокат, верно?)

Чтобы добиться этого, убедитесь, что тело вашего ответа 403 Forbidden передает страшно звучащее сообщение в виде строки "Этот запрос превышает максимально допустимое использование API. Ваш IP-адрес был зарегистрирован. Пожалуйста, ознакомьтесь с условиями обслуживания и подчиняются директивам в robots.txt. "

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

Я не поощряю использование назначенных API-ключей / токенов, потому что они становятся барьером для принятия и своего рода болью в шее, с которой приходится справляться. В качестве контраргумента ответа @ womp, Google постепенно отходит от их использования. Кроме того, я не думаю, что они на самом деле применимы в этом случае, потому что похоже, что ваш «API» больше похож на вызов JSON, который используется в основном на вашем собственном сайте.

3 голосов
/ 13 октября 2009

Все большие REST API, как правило, используют токенизированную аутентификацию - в основном, прежде чем выполнить запрос REST, вы должны отправить какой-то другой запрос в службу токенов, чтобы получить токен для включения в ваш запрос данных. Bing Maps делает это, Amazon делает это, Flickr делает это ... и т.д.

Я не слишком много знаю об этом, кроме того, что работал с Bing Maps. Вам нужно будет прочитать о токенизированной аутентификации с помощью REST. Вот сообщение в блоге, чтобы вы начали: http://www.naildrivin5.com/daveblog5000/?p=35

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...