Обеспечение безопасности JSONP? - PullRequest
9 голосов
/ 06 октября 2010

У меня есть скрипт, который использует JSONP для выполнения междоменных вызовов ajax. Это прекрасно работает, но мой вопрос в том, есть ли способ запретить другим сайтам доступ и получение данных с этих URL-адресов? Я в основном хотел бы составить список сайтов, которые разрешены и возвращать данные только в том случае, если они есть в списке. Я использую PHP и думаю, что я мог бы использовать "HTTP_REFERER", но читал, что некоторые браузеры не будут отправлять эту информацию .... ??? Есть идеи?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 06 октября 2010

Там действительно нет эффективного решения.Если ваш JSON доступен через браузер, то он одинаково доступен и для других сайтов.Для веб-сервера запрос, исходящий из браузера или другого сервера, практически неотличим от заголовков.Как прокомментировал ILMV, рефереры (и другие заголовки) могут быть сфальсифицированы.Они ведь самоотчеты.

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

Учитывая эту мысль, вы можете создать барьер входа достаточно высоко, чтобы другие сайты, вероятно, не потрудились бы делать запросы с установленными барьерами входа.Вы можете сгенерировать одноразовые токены, необходимые для получения данных JSON.Как только токен используется для получения данных JSON, токен впоследствии становится недействительным.Чтобы получить токен, необходимо запросить веб-страницу с токеном, встроенным в страницу в javascript, который затем помещается в вызов ajax для данных json.Объедините это с токенами с истекающим временем и достаточным запутыванием в javascript, и вы создали достаточно высокий барьер.

Просто помните, что это невозможно обойти.Другой веб-сайт может извлечь токен из javascript и / или перехватить вызов ajax и захватить данные в нескольких точках.

0 голосов
/ 04 февраля 2014

Работа с importScript формой Web Worker аналогична jsonp. Сделайте двойную проверку, как сказал AlexPoon. Main-скрипт для веб-работника, веб-работника для отправки и обратно с запросом безопасности Если веб-работник отвечает на основной сценарий без запроса или с неправильным токеном, лучше перенаправить ваш сайт в нирвану. Если сервер спрашивается с неправильным токеном, не отвечайте. Файлы cookie не будут отправляться с запросом importScript, поскольку документ недоступен на уровне веб-работника. Всегда отправляйте файлы cookie, относящиеся к безопасности, с помощью почтового запроса.

Но есть еще много рисков. Человек посередине знает как.

0 голосов
/ 17 июля 2012

Как насчет использования файла cookie, содержащего токен, используемый при каждом запросе jsonp?В зависимости от настройки вы также можете использовать переменную, если вы не хотите использовать куки.

0 голосов
/ 12 октября 2010

Я уверен, что вы можете сделать это с помощью htaccess -

Убедитесь, что ваши заголовки отправляют "HTTP_REFERER" - я не знаю ни одного браузера, который не будет отправлять его, если вы скажете это.(если вы все еще беспокоитесь, отступите изящно)

Затем используйте htaccess, чтобы разрешить / запретить доступ от правого реферера.

# deny all except those indicated here
order deny,allow
deny from all
allow from .*domain\.com.*
0 голосов
/ 07 октября 2010

Есть ли у вас доступ к серверам / сайтам, которым вы хотели бы предоставить доступ к JSONP?

Что вы могли бы сделать, хотя не идеальным является добавление записи в БД IP назагрузка страницы, которой разрешено просматривать JSONP, затем при загрузке jsonp проверить, существует ли эта запись.Возможно, при необходимости истекает срок действия записи.

например,

http://mysite.com/some_page/ - пользователь загружает страницу, добавляет свой IP-адрес в базу данных разрешенных пользователей

http://anothersite.com/anotherpage - как указано выше, добавить в базу данных

  • загрузить JSONP, проверить, что IP существует в базе данных.
  • Через один час удалить запись из БД, так что другойзагрузка страницы потребовалась бы, например,

Хотя это можно было бы легко обойти, если бы скребку (или другим сайтам) удалось определить, какой метод вы используете, чтобы позволить пользователям просматривать JSONP, онинужно только сначала зайти на страницу.

...