Правило ограничения домена – это функция безопасности браузера, которая ограничивает взаимодействие документов и скриптов из одного источника с ресурсами из другого.
Браузер может загружать и показывать ресурсы с нескольких сайтов одновременно. Например, у вас может быть открыто несколько вкладок одновременно или на сайте может быть встроено несколько фреймов iframe с разных сайтов. Если не ограничить взаимодействие между этими ресурсами, то злоумышленник, взломавший скрипт, сможет получить доступ ко всем данным в браузере пользователя.
Правило ограничения домена предотвращает это, блокируя доступ на чтение к ресурсам, загруженным из другого источника. "Но подождите, – скажете вы, – я постоянно загружаю изображения и скрипты из других источников". Браузеры позволяют нескольким тегам встраивать ресурсы из другого источника. Это правило в основном является историческим артефактом и может подвергнуть ваш сайт уязвимостям, таким как кликджекинг с использованием iframe. Вы можете ограничить чтение этих тегов из разных источников с помощью Content Security Policy.
Что считается одним источником?
Источник определяется схемой (также известной как протокол, например HTTP или HTTPS), портом (если он указан) и хостом. Если все три элемента совпадают для двух 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 - Think and Check assessment
Как предотвратить кликджекинг
При атаке, называемой "кликджекинг", сайт встраивается в iframe и накладывается на прозрачные кнопки, которые ведут на другой ресурс. Пользователи думают, что работают с вашим приложением, но на самом деле отправляют данные злоумышленникам.
Чтобы запретить другим сайтам встраивать ваш сайт в iframe, добавьте в HTTP-заголовки правило Content Security Policy с директивой frame-ancestors.
Вы также можете добавить X-Frame-Options в HTTP-заголовки. Список вариантов приведен на сайте MDN.
Итоги
Надеюсь, вы почувствовали облегчение, узнав, что браузеры усердно работают над обеспечением безопасности в интернете. Хотя браузеры пытаются обеспечить безопасность, блокируя доступ к ресурсам, иногда вам может потребоваться доступ к ресурсам из разных источников в ваших приложениях. В следующем руководстве вы узнаете о технологии совместного использования ресурсов между разными источниками (CORS) и о том, как сообщить браузеру, что загрузка ресурсов из разных источников разрешена из доверенных источников.