Политика одного и того же источника — это функция безопасности браузера, которая ограничивает взаимодействие документов и сценариев в одном источнике с ресурсами в другом источнике.
Браузер может загружать и отображать ресурсы с нескольких сайтов одновременно. У вас может быть одновременно открыто несколько вкладок или на сайте может быть встроено несколько iframe с разных сайтов. Если нет ограничений на взаимодействие между этими ресурсами и скрипт скомпрометирован злоумышленником, скрипт может раскрыть все, что находится в браузере пользователя.
Политика одного и того же источника предотвращает это, блокируя доступ на чтение к ресурсам, загруженным из другого источника. «Но подождите, — скажете вы, — я все время загружаю изображения и скрипты из других источников». Браузеры позволяют нескольким тегам встраивать ресурсы из другого источника. Эта политика в основном является историческим артефактом и может подвергнуть ваш сайт уязвимостям, таким как кликджекинг с использованием iframe . Вы можете ограничить чтение этих тегов из разных источников с помощью Политики безопасности контента .
Что считается одинакового происхождения?
Источник определяется схемой (также известной как протокол, например HTTP или HTTPS), портом (если он указан) и хостом. Если все три URL одинаковы для двух URL-адресов, они считаются имеющими одно и то же происхождение. Например, http://www.example.com/foo
имеет тот же источник, что и http ://www.example.com/bar
, но не https ://www.example.com/bar
, поскольку схема другая.
Что разрешено, а что запрещено?
Как правило, встраивание ресурса из разных источников разрешено, тогда как чтение ресурса из разных источников блокируется.
iframe | Встраивание из разных источников обычно разрешено (в зависимости от директивы X-Frame-Options ), но чтение из разных источников (например, использование JavaScript для доступа к документу в iframe) — нет. |
CSS | CSS из разных источников можно внедрить с помощью элемента <link> или @import в файл CSS. Может потребоваться правильный заголовок Content-Type . |
формы | URL-адреса перекрестного происхождения можно использовать в качестве значения атрибута action элементов формы. Веб-приложение может записывать данные формы в пункт назначения с несколькими источниками. |
изображений | Разрешено встраивание изображений из разных источников. Однако чтение данных изображения из разных источников (например, извлечение двоичных данных из изображения из разных источников с помощью JavaScript) блокируется. |
мультимедиа | Видео и аудио из разных источников можно встроить с помощью элементов <video> и <audio> . |
сценарий | Могут быть встроены сценарии перекрестного происхождения; однако доступ к определенным API (например, запросам на выборку из разных источников) может быть заблокирован. |
TODO: DevSite — подумайте и проверьте оценку
Как предотвратить кликджекинг
Атака под названием «кликджекинг» заключается в встраивании сайта в iframe
и наложении на него прозрачных кнопок, ведущих к другому месту назначения. Пользователей обманом заставляют думать, что они получают доступ к вашему приложению, одновременно отправляя данные злоумышленникам.
Чтобы запретить другим сайтам встраивать ваш сайт в iframe, добавьте в HTTP-заголовки политику безопасности контента с директивой frame-ancestors
.
Альтернативно вы можете добавить X-Frame-Options
в заголовки HTTP, список опций см. в MDN .
Заворачивать
Надеюсь, вы почувствуете небольшое облегчение от того, что браузеры усердно работают над обеспечением безопасности в Интернете. Несмотря на то, что браузеры пытаются обезопасить себя, блокируя доступ к ресурсам, иногда вам может потребоваться доступ к ресурсам перекрестного происхождения в ваших приложениях. В следующем руководстве вы узнаете о совместном использовании ресурсов из разных источников (CORS) и о том, как сообщить браузеру, что загрузка ресурсов из разных источников разрешена из доверенных источников.