Как предотвратить прямой доступ к моему сервису JSON? - PullRequest
7 голосов
/ 05 апреля 2010

У меня есть веб-сервис JSON для возврата домашних маркеров, которые будут отображаться на моей карте Google.

По сути, http://example.com вызывает веб-службу, чтобы выяснить расположение всех маркеров карты для отображения следующим образом:

http://example.com/json/?zipcode=12345

И возвращает строку JSON, такую ​​как:

{"address": "321 Main St, Mountain View, CA, USA", ...}

Итак, на моей странице index.html я беру эту строку JSON и размещаю маркеры карты.

Однако я не хочу, чтобы люди обращались к моему веб-сервису JSON напрямую .

Я только хочу, чтобы http://example.com/index.html мог звонить на мой http://example.com/json/ веб-сервис ... а не какой-нибудь случайный чувак, напрямую звонящий на /json/.

Quesiton : как запретить прямой вызов / доступ к моей http://example.com/json/ веб-службе?


UPDATE:

Для большей ясности http://example.com/index.html позвоните http://example.com/json/?zipcode=12345 ... и в службу JSON
- возвращает полу-чувствительные данные,
- возвращает массив JSON,
- отвечает на запросы GET,
- в браузере, выполняющем запрос, включен JavaScript

Опять же, я не хочу, чтобы люди просто смотрели на мой index.html исходный код и затем напрямую вызывали службу JSON.

Ответы [ 6 ]

9 голосов
/ 05 апреля 2010

Есть несколько хороших способов аутентификации клиентов.

  • По IP-адресу. В Apache используйте директивы Allow / Deny.
  • По HTTP-аутентификации: базовый или дайджест. Это красиво и стандартизировано и использует для аутентификации имена пользователей и пароли.
  • По cookie. Вам нужно придумать печенье.
  • Созданным вами пользовательским заголовком HTTP.

Edit:

Сначала я не уловил, что ваш веб-сервис вызывается клиентским кодом. Буквально НЕ ВОЗМОЖНО препятствовать тому, чтобы люди обращались к вашему веб-сервису напрямую, если вы позволяете Javascript на стороне клиента делать это. Кто-то может просто прочитать исходный код.

5 голосов
/ 05 апреля 2010

Некоторые более конкретные ответы здесь, но я хотел бы сделать следующее общее замечание:

Все, что делается через AJAX, загружается браузером пользователя.Вы могли бы усложнить жизнь хакеру, если бы захотели, но, в конечном итоге, нет никакого способа помешать мне получить данные, которые вы уже бесплатно предоставили мне .Любая общедоступная услуга является общедоступной, простой и понятной.

2 голосов
/ 05 апреля 2010

Принимайте только запросы POST к URL-адресу JSON. Это не помешает определенным людям добраться до него, но предотвратит случайный просмотр.

1 голос
/ 02 августа 2011

Можно добавить случайное число в качестве флага, чтобы определить, поступает ли запрос со страницы, только что отправленной:

1) Когда генерируется index.html, добавьте случайное число в URL-адрес запроса JSON:

Старый: http://example.com/json/?zipcode=12345

Новый: http://example.com/json/?zipcode=12345&f=234234234234234234

Добавьте этот номер также в Контекст сеанса .

2) Браузер клиента отображает index.html и запрашивает данные JSON по новому URL.

3) Ваш сервер получает запрос json и проверяет номер флага с помощью Контекст сеанса .Если совпадают, ответные данные.В противном случае вернуть сообщение об ошибке.

4) Очистить Контекст сеанса к концу ответа или срабатывает тайм-аут.

1 голос
/ 05 апреля 2010

Если вы используете Apache, вы можете установить разрешение / запрет на локации.

http://www.apachesecurity.net/

или вот ссылка на документы Apache по директиве Deny

http://httpd.apache.org/docs/2.0/mod/mod_access.html#deny

РЕДАКТИРОВАТЬ (отвечая на новую информацию).

Директива Deny также работает с переменными среды. Вы можете ограничить доступ, основываясь на строке браузера (не очень надежно, но не поощряет случайный просмотр), который все еще разрешает вызовы XHR.

Я бы предложил, чтобы лучший способ сделать это - иметь какой-то токен, который подтверждает, что запрос является «хорошим» запросом. Вы можете сделать это с помощью cookie, какого-либо хранилища сеансов или параметра (или некоторой комбинации).

Что бы я предложил для чего-то подобного, это создать уникальный URL для службы, срок действия которой истекает через короткий промежуток времени. Вы можете сделать что-то подобное довольно легко с Memcache. Эту стратегию также можно использовать для обфускации URL-адреса службы (который не обеспечит никакой реальной безопасности, но поднимет планку для человека, желающего совершать прямые вызовы).

Наконец, вы также можете использовать криптографию с открытым ключом, но это будет очень тяжело. Вам нужно будет генерировать новую пару ключей pub / priv для каждого запроса и возвращать pubkey клиенту js (здесь ссылка на реализацию в javascript) http://www.cs.pitt.edu/~kirk/cs1501/notes/rsademo/

0 голосов
/ 05 апреля 2010

Возможно, вам понадобится какая-то аутентификация на основе файлов cookie. Кроме того, у Игнасио есть хорошая точка зрения относительно использования POST. Это может помочь предотвратить захват JSON , если в вашем домене запущены ненадежные сценарии. Однако я не думаю, что использование POST строго необходимо, если только внешний тип JSON не является массивом. В вашем примере это объект.

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