Если я посетить вредоносный веб-сайт, я хочу быть уверен, что:
- Он не может читать мои личные данные с других веб-сайтов, которые я использую. Think attacker.com, читающий gmail.com
- Он не может выполнять действия от моего имени на других сайтах, которые я использую. Подумайте, как атаковать злоумышленник, перечислив средства со своего счета на bank.com.
Same Origin Policy решает первую проблему. Вторая проблема называется подделкой запроса на перекрестный сайт и не может быть решена с помощью существующих междоменных ограничений.
Та же политика происхождения в целом соответствует следующим правилам -
- Правило 1: Не давайте вы читали что-нибудь из другого домена
- Правило 2: Позволяет писать все, что вы хотите другой домен, но правило № 1 не позволит вам прочитать ответ.
- Правило 3: Вы можете свободно делать запросы GET междоменные и запросы POST, но вы не можете контролировать HTTP-заголовки
Давайте посмотрим, как различные вещи, которые вы перечислили линии до вышеуказанных правил:
<img>
теги позволяют делать HTTP-запрос, но нет возможности прочитать содержимое изображения, кроме простого его отображения. Например, если я сделаю это <img src="http://bank.com/get/latest/funds"/>
, запрос будет проходить (правило 2). Но нападающий не может видеть мой баланс (правило 1).
<script>
теги работают в основном как <img>
. Если вы сделаете что-то вроде <script src="http://bank.com/get/latest/funds">
, запрос будет проходить. Браузер также попытается проанализировать ответ как JavaScript, и он потерпит неудачу.
Существует известное злоупотребление знаками <script>
под названием JSONP, где вы вступаете в сговор с междоменным сервером, чтобы вы могли «читать» кросс-домен. Но без явного участия сервера междоменного, вы не можете прочитать ответ через <script>
тег
<link>
для таблиц стилей работать в основном как <script>
теги, за исключением того, ответ оценивается как CSS. В общем, вы не можете прочитать ответ - если ответ каким-то образом не будет правильно сформированным CSS.
- это, по сути, новое окно браузера. Вы не можете прочитать HTML-код междоменного iframe. Кстати, вы можете изменить URL-адрес междоменного iframe, но вы не можете прочитать URL-адрес. Обратите внимание, как это следует из двух правил, упомянутых выше.
XMLHttpRequest
- самый универсальный способ для обработки HTTP-запросов. Это полностью находится в управлении разработчиками; браузер не делает ничего с ответом. Например, в случае <img>
, <script>
или <link>
, браузер принимает определенный формат и, в целом, проверяет его соответствующим образом. Но в XHR нет предписанного формата ответа. Таким образом, браузеры применяют одну и ту же политику происхождения и не позволяют вам прочитать ответ, если веб-сайт перекрестного домена явно не позволяет вам.
Шрифты через font-face
являются аномалией. AFAIK, только для Firefox требуется поведение при входе; другие браузеры позволяют использовать шрифты так же, как вы использовали бы изображения.
Короче говоря, такая же политика происхождения согласована. Если вы найдете способ сделать кросс-доменный запрос и, прочитайте ответ без явного разрешения на междоменном веб-сайте - вы сделаете заголовки по всему миру.
EDIT: Почему я не могу обойти все это с помощью прокси-сервера на стороне сервера?
Чтобы gmail отображал персонализированные данные, ему нужны куки-файлы из вашего браузера. Некоторые сайты используют базовую аутентификацию HTTP, в которой учетные данные хранятся в браузере.
Прокси-сервер на стороне сервера не может получить доступ к файлам cookie или базовым учетным данным. И поэтому, даже если он может сделать запрос, сервер не будет возвращать данные, специфичные для пользователя.
Хм ... Я начинаю соединять точки. Это, безусловно, самый полезный ответ. Но не могли бы вы объяснить, почему код клиента, выдающий запрос GET на gmail.com, хуже кода сервера? Я думаю, что я понимаю, почему, но для того, чтобы это было полным ответом, важно обратиться к «почему я не могу обойти все это с помощью серверного прокси». – Domenic
@ Domenic - См. Мои обновления. Когда клиентский код делает запрос, куки-файлы передаются неявно. Эти файлы cookie позволяют междоменному серверу идентифицировать пользователя и, следовательно, возвращать персонализированные данные. Прокси-сервер на стороне сервера не будет иметь доступа к этим куки, поэтому он не может читать личные данные. –
Отлично, спасибо! Особенно полезно, что вы явно указали файлы cookie и основные учетные данные; Я думал о куках. – Domenic