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, но теперь современные браузеры запрещают это.