Политика одного источника (SOP)
В этом разделе мы объясняем, что такое политика одного источника (SOP) и как она реализована.
Что такое политика одного источника?
Политика одного источника — это механизм безопасности веб-браузера, направленный на предотвращение атак веб-сайтов друг на друга.
Политика одного источника ограничивает доступ скриптов на одном источнике к данным с другого источника. Источник состоит из схемы URI, домена и номера порта. Например, рассмотрим следующий URL:
http://normal-website.com/example/example.htmlЗдесь используется схема http, домен normal-website.com и порт 80. Следующая таблица показывает, как будет применяться политика одного источника, если содержимое по указанному выше URL попытается обратиться к другим источникам:
http://normal-website.com/example/
Да: одинаковые схема, домен и порт
http://normal-website.com/example2/
Да: одинаковые схема, домен и порт
https://normal-website.com/example/
Нет: другая схема и порт
http://en.normal-website.com/example/
Нет: другой домен
http://www.normal-website.com/example/
Нет: другой домен
http://normal-website.com:8080/example/
Нет: другой порт*
*Internet Explorer разрешит этот доступ, поскольку IE не учитывает номер порта при применении политики одного источника.
Зачем нужна политика одного источника?
Когда браузер отправляет HTTP-запрос с одного источника на другой, любые cookie, включая cookie аутентификационной сессии, относящиеся к другому домену, также отправляются как часть запроса. Это означает, что ответ будет сгенерирован в рамках пользовательской сессии и включит любые релевантные данные, специфичные для пользователя. Без политики одного источника, если бы вы посетили вредоносный веб-сайт, он смог бы прочитать ваши электронные письма из GMail, личные сообщения из Facebook и т. д.
Как реализована политика одного источника?
В целом политика одного источника контролирует доступ JavaScript-кода к контенту, загруженному кросс-доменно. Кросс-доменная загрузка ресурсов страницы, как правило, разрешена. Например, SOP допускает встраивание изображений через тег <img>, медиаконтента через тег <video> и JavaScript через тег <script>. Однако, хотя эти внешние ресурсы могут быть загружены страницей, любой JavaScript на странице не сможет прочитать содержимое этих ресурсов.
Существуют различные исключения из политики одного источника:
Некоторые объекты доступны кросс-доменно для записи, но не для чтения, например объект
locationили свойствоlocation.hrefиз iframe или новых окон.Некоторые объекты доступны кросс-доменно для чтения, но не для записи, например свойство
lengthобъектаwindow(которое хранит количество фреймов, используемых на странице) и свойствоclosed.Функцию
replaceобычно можно вызывать кросс-доменно на объектеlocation.Некоторые функции можно вызывать кросс-доменно. Например, для нового окна можно вызвать функции
close,blurиfocus. ФункциюpostMessageтакже можно вызывать для iframe и новых окон, чтобы отправлять сообщения с одного домена на другой.
Из-за требований обратной совместимости политика одного источника более мягкая в отношении cookie, поэтому они часто доступны со всех поддоменов сайта, хотя каждый поддомен технически является отдельным источником. Частично снизить этот риск можно с помощью флага cookie HttpOnly.
Политику одного источника можно ослабить с помощью document.domain. Это специальное свойство позволяет ослабить SOP для конкретного домена, но только если он является частью вашего FQDN (полностью квалифицированного доменного имени). Например, у вас может быть домен marketing.example.com, и вы хотите читать содержимое этого домена на example.com. Для этого оба домена должны установить document.domain в значение example.com. Тогда SOP позволит доступ между двумя доменами, несмотря на разные источники. Ранее можно было установить document.domain на TLD, например com, что позволяло доступ между любыми доменами на одном TLD, но теперь современные браузеры предотвращают это.
Last updated