Почему API браузера ограничивают междоменные запросы? - PullRequest
34 голосов
/ 10 февраля 2012

XMLHttpRequest s требуют CORS для работы междоменных.Аналогично для веб-шрифтов, текстур WebGL и некоторых других вещей.В целом все новые API, похоже, имеют это ограничение.

Почему?

Это так легко обойти: все, что нужно, это простой прокси на стороне сервера.Другими словами, серверный код не запрещает выполнять междоменные запросы;почему код на стороне клиента?Как это может обеспечить кому-либо безопасность?

И это настолько противоречиво: я не могу XMLHttpRequest, но я могу <script src> или <link rel> или <img src> или <iframe>.Что вообще делает ограничение XHR и т. Д.

Ответы [ 3 ]

57 голосов
/ 10 февраля 2012

Если я захожу на вредоносный веб-сайт, я хочу быть уверен, что:

  1. Он не может прочитать мои личные данные с других веб-сайтов, которые я использую.Представьте, что attacker.com читает gmail.com
  2. Он не может выполнять действий от моего имени на других веб-сайтах, которые я использую.Подумайте, что Attack.com переводит средства со своего счета на bank.com

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

Та же политика происхождения в целом соответствует следующим правилам -

  • Правило 1: не позволяет вам читать что-либо из другого домена
  • Правило 2: позволяет писать все, что вы хотите, в другом домене, но правило # 1 не позволяет вам читать ответ.
  • Правило 3: Вы можете свободно создавать междоменные запросы GET и POST, но вы не можете контролировать заголовки HTTP

Позволяет увидеть, как различные вещи, перечисленные вами, соответствуютПриведенные выше правила: теги

  1. <img> позволяют сделать HTTP-запрос, но нет способа прочитать содержимое изображения, кроме простого его отображения.Например, если я сделаю это <img src="http://bank.com/get/latest/funds"/>, запрос будет обработан (правило 2).Но злоумышленник не может увидеть мой баланс (правило 1). Теги

  2. <script> работают в основном как <img>.Если вы сделаете что-то вроде <script src="http://bank.com/get/latest/funds">, запрос будет обработан.Браузер также попытается проанализировать ответ как JavaScript, и потерпит неудачу.

  3. Хорошо известно злоупотребление тегами <script> под названием JSONP, когда вы вступаете в сговор с междоменным доменом.сервер, так что вы можете «читать» междоменный.Но без явного участия междоменного сервера вы не можете прочитать ответ через тег <script>

  4. <link>, поскольку таблицы стилей работают в основном как теги <script>, кромеОтвет оценивается как CSS.В общем, вы не можете прочитать ответ - если ответ каким-то образом не является правильно сформированным CSS.

  5. <iframe> по сути является новым окном браузера.Вы не можете прочитать HTML междоменного iframe.Кстати, вы можете изменить URL-адрес междоменного iframe, но не можете прочитать URL-адрес.Обратите внимание, как это следует двум упомянутым выше правилам.

  6. XMLHttpRequest - самый универсальный метод для выполнения HTTP-запросов.Это полностью в контроле разработчиков;браузер ничего не делает с ответом.Например, в случае <img>, <script> или <link> браузер принимает определенный формат и, как правило, проверяет его соответствующим образом.Но в XHR нет предписанного формата ответа.Таким образом, браузеры применяют одну и ту же политику происхождения и не позволяют вам читать ответ, если только междоменный веб-сайт явно не разрешает вам.

  7. Шрифты через font-face являются аномалией.AFAIK, только Firefox требует opt-in поведения;другие браузеры позволяют использовать шрифты так же, как вы используете изображения.

Короче говоря, одинаковая политика происхождения является последовательной.Если вы найдете способ сделать междоменный запрос и , прочитав ответ без явного разрешения междоменного веб-сайта, вы будете получать заголовки по всему миру.* РЕДАКТИРОВАТЬ : Почему я не могу обойти все это с помощью прокси-сервера?

Чтобы gmail отображал персонализированные данные, ему нужны файлы cookie из вашего браузера.Некоторые сайты используют базовую аутентификацию HTTP, в которой учетные данные хранятся в браузере.

Прокси-серверная сторона не может получить доступ ни к файлам cookie, ни к базовым учетным данным.И поэтому, даже если он может сделать запрос, сервер не вернет данные, специфичные для пользователя.

3 голосов
/ 10 февраля 2012

Рассмотрим этот сценарий ...

  1. Вы заходите на мой вредоносный сайт.
  2. Мой сайт отправляет XHR на ваш банковский сайт и запрашивает форму для банковского перевода.
  3. XHR читает токен, который запрещает CSRF и POST, заполняет форму рядом с токеном безопасности и переводит сумму денег на мой счет.
  4. (I) Прибыль !!!

Если бы не существовала та же политика происхождения, вы могли бы отправить эту форму POST, но вы не смогли бы запросить токен CSRF, который предотвращает CSRF.

Код на стороне сервера не запускается на компьютере клиента.

2 голосов
/ 10 февраля 2012

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

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

...