SOP: Что такое Same-origin policy
Same-origin policy — механизм безопасности веб-браузера, направленный на предотвращение атак веб-сайтов с других сайтов.
Same-origin policy ограничивает доступ сценариев из одного источника к данным другого источника. Источник состоит из URI схемы, домена и номера порта. Например, рассмотрим следующий URL адрес:
http://normal-website.com/example/example.html
Он использует схему http
, домен normal-website.com
и порт номер 80
. В следующей таблице показано, как будет применяться Same-origin policy, если контент по указанному выше адресу пытается получить доступ к другим источникам:
Доступ к 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/ | Нет: другой домен* |
Зачем нужен Same-origin policy
Когда браузер отправляет HTTP-запрос из одного источника в другой, любые cookie, включая cookie сессии аутентификации, относящиеся к другому домену, также отправляются как часть запроса. Это означает, что ответ будет сгенерирован в рамках сеанса пользователя и будет включать любые релевантные данные, специфичные для пользователя. Без Same-origin policy, если вы посетите вредоносный файл, он сможет читать ваши электронные письма из Gmail, личные сообщения из социальных сетей и т.д.
Как Same-origin policy реализован
Same-origin policy обычно контролирует доступ JavaScript кода к содержимому загружаемому между доменами. Как правило, разрешена загрузка ресурсов страницы из разных источников. Например, SOP позволяет встраивать изображения с помощью тега <img>
, медиафайлы с помощью тега <video>
, а JavaScript подключается с помощью <script>
. Хотя все эти ресурсы могут быть загружены страницей, не каждый JavaScript код на странице сможет прочитать эти данные.
Существуют различные исключения Same-origin policy:
- Некоторые объекты доступны для записи, но не для чтения между доменами, такие как объект
location
илиlocation.href
из фреймов и новых окон. - Некоторые объект доступны для чтения, но не для записи между доменами, например, свойство
length
объектаwindow
(в котором храниться количество фреймов используемых на странице) и свойствоclosed
. - Функцию
replace
можно назвать между доменной для объектаlocation
. - Вы можете вызывать определённые функции между доменами. Например, вы можете вызвать функции
close
,blur
иfocus
для нового окна. ФункциюpostMessage
также можно вызвать для встроенных фреймов и новых окон для отправки сообщения из одного домена в другой.
Из-за устаревших требований same-origin policy является более мягкой при работе с cookie файлами, поэтому они часто доступны со всех поддоменов сайта, даже если каждый поддомен технические имеет другое происхождение. Вы можете частично снизить этот риск, используя cookie флаг HttpOnly
.
Можно смягчить same-origin policy используя document.domain
. Это специальное свойство позволяет смягчить SOP для определённого домена, но только если он является частью вашего FQDN (полного доменного имени). Например, у вас может быть домен marketing.example.com
, и вы хотели бы прочитать содержимое этого домена на example.com
. Тогда SOP разрешит доступ между двумя доменами, несмотря на их различное происхождение. Раньше можно было установить для document.domain
TLD, такой, как com
, что разрешало доступ любым доменам в одном и том же TLD, но теперь современные браузеры запрещают это.