иконка discount

Скидка 15% по промокоду

кибер понедельник до 01.12иконка discount
CYBER2025
логотип PurpleSchool
логотип PurpleSchool

Встроенный фрейм HTML iframe - полное практическое руководство

Автор

Олег Марков

Введение

Элемент iframe в HTML позволяет встраивать одну веб‑страницу внутрь другой. По сути, это «окно», через которое вы показываете внешний или внутренний ресурс: видео с YouTube, карту, платежную форму, административную панель или любой другой сайт.

Смотрите, я покажу вам, как это работает в самом простом виде:

<!-- Встраиваем страницу https://example.com внутрь текущей -->
<iframe src="https://example.com" width="600" height="400"></iframe>

Как только браузер видит iframe, он загружает указанный ресурс как отдельный документ, но отображает его внутри текущей страницы. Важно понимать, что это фактически отдельный контекст: у него свой DOM, свой JavaScript и свои куки (в рамках того же домена).

В этой статье вы увидите:

  • как правильно использовать iframe и его основные атрибуты;
  • как настраивать размеры, адаптивность и стили;
  • как обрабатывать события загрузки и взаимодействовать через JavaScript;
  • как настраивать безопасность через sandbox, referrerpolicy, CSP;
  • когда iframe уместен, а когда лучше использовать другие подходы (API, компоненты, SSR).

Давайте по шагам разберем, как устроен iframe и что вы реально можете с ним сделать.

Основы элемента iframe

Базовый синтаксис

Начнем с классического примера. Здесь я размещаю пример, чтобы вам было проще понять базовую структуру:

<!-- Простейший iframe с фиксированными размерами -->
<iframe
  src="https://example.com"      <!-- URL встроенной страницы -->
  width="800"                    <!-- Ширина области iframe в пикселях -->
  height="600"                   <!-- Высота области iframe в пикселях -->
  title="Демонстрационная страница"> <!-- Описание для доступности -->
</iframe>

Разберем ключевые моменты:

  • src — обязательный в реальном использовании атрибут, указывает URL ресурса;
  • width и height — размеры области отображения в CSS‑пикселях;
  • title — важен для доступности, особенно для пользователей скринридеров.

Сам элемент по умолчанию ведет себя как inline-block. Вы можете управлять его отображением через CSS: задать display, рамки, тени, округление углов и т. д.

Встроенный контент и независимый контекст

Важно понять концепцию контекста:

  • iframe создает отдельный документ;
  • JS внутри iframe не «видит» родительский DOM, если страница с другого домена (политика одинакового источника);
  • события, стили и скрипты не «протекают» между документами автоматически.

Это удобно, когда вы хотите изолировать:

  • сторонний функционал (виджет оплаты, форма, чат);
  • административный интерфейс;
  • старый или унаследованный фронтенд.

Но именно эта изоляция усложняет взаимодействие между родителем и iframe, о чем мы поговорим дальше.

Основные атрибуты iframe

src и srcdoc

src

src — главный атрибут, задающий URL встроенного документа:

<iframe src="https://maps.google.com" title="Карта"></iframe>

Если не указать src, браузер все равно создаст пустой документ внутри iframe, но он будет «about:blank». Иногда это используют, чтобы сначала создать iframe, а затем задать ему src динамически через JS.

srcdoc

srcdoc позволяет встроить HTML код напрямую в атрибут, без отдельного файла:

<iframe
  title="Пример с srcdoc"
  srcdoc="
    <!doctype html>
    <html>
      <head>
        <meta charset='utf-8'>
        <style>
          body { font-family: sans-serif; margin: 0; padding: 10px; }
        </style>
      </head>
      <body>
        <h1>Контент из srcdoc</h1>
        <p>Этот HTML встроен прямо в атрибут srcdoc.</p>
      </body>
    </html>
  ">
</iframe>

Обратите внимание:

  • содержимое srcdoc — это полноценный HTML‑документ;
  • если указаны и src, и srcdoc, приоритет имеет srcdoc;
  • вам нужно аккуратно экранировать кавычки, чтобы не «сломать» атрибут;
  • такой подход удобен, когда вы хотите генерировать независимый мини‑документ на лету.

width и height

width и height задают размеры iframe. Давайте разберемся на примере:

<!-- Фиксированные размеры -->
<iframe
  src="https://example.com"
  width="600"       <!-- ширина 600px -->
  height="400"      <!-- высота 400px -->
  title="Фиксированный iframe">
</iframe>

Но на практике жестко фиксировать размеры не всегда удобно, особенно на мобильных устройствах. Чаще вы будете использовать комбинацию HTML‑атрибутов и CSS.

Например, вы задаете базовый размер в HTML, но на малых экранах переопределяете его через CSS:

<iframe
  src="https://example.com"
  width="800"
  height="450"
  class="video-frame"
  title="Видео">
</iframe>
/* Базовый размер для десктопа */
.video-frame {
  max-width: 100%;  /* не вылезает за пределы контейнера */
}

/* На маленьких экранах переопределяем высоту */
@media (max-width: 600px) {
  .video-frame {
    height: 250px;  /* уменьшаем высоту на мобильных */
  }
}

name

name задает имя фрейма, по которому можно к нему обращаться из ссылок или скриптов:

<!-- Определяем именованный iframe -->
<iframe
  src="about:blank"
  name="contentFrame"
  title="Фрейм с контентом">
</iframe>

<!-- Ссылка, открывающаяся внутри iframe -->
<a href="page.html" target="contentFrame">Открыть страницу в iframe</a>

Здесь важно:

  • значение target в ссылке должно совпадать с name iframe;
  • так можно организовать простую навигацию внутри блока страницы без перезагрузки всего документа.

title

title — часто забываемый, но критичный для доступности атрибут. Он нужен для:

  • пользователей скринридеров;
  • случаев, когда контент не может быть загружен.

Пример:

<iframe
  src="https://www.youtube.com/embed/ID"
  title="Видео о работе элемента iframe в HTML">
</iframe>

Старайтесь описывать, что внутри фрейма, а не просто писать «iframe».

frameborder, scrolling и устаревшие атрибуты

Ранее часто использовали:

  • frameborder="0" — убрать рамку;
  • scrolling="no" — отключить полосы прокрутки.

Сейчас они считаются устаревшими. Лучше делать это через CSS:

<iframe
  src="https://example.com"
  class="no-border"
  title="Фрейм без рамки">
</iframe>
.no-border {
  border: none;        /* убираем рамку */
  overflow: hidden;    /* скрываем полосы прокрутки содержимого */
}

Но учтите: overflow управляет областью iframe как элемента, а не содержимым внутри него. Принудительно убрать скролл у содержимого стороннего сайта вы не сможете без контроля над этим сайтом.

Современные атрибуты и безопасность

sandbox

sandbox — один из ключевых атрибутов для безопасности. Он включает «песочницу» и жестко ограничивает возможности страницы внутри iframe.

Без параметров:

<iframe
  src="https://example.com"
  sandbox
  title="Песочница по умолчанию">
</iframe>

В этом режиме по умолчанию запрещено очень многое:

  • выполнение скриптов;
  • открытие всплывающих окон;
  • навигация верхнего окна;
  • запуск плагинов и многое другое.

Чтобы частично снять ограничения, вы добавляете разрешения через пробел:

<iframe
  src="https://example.com"
  sandbox="allow-scripts allow-same-origin"
  title="Ограниченный iframe">
</iframe>

Распространенные флаги:

  • allow-scripts — разрешает выполнение JS;
  • allow-same-origin — считает содержимое из того же источника, что и родитель;
  • allow-forms — разрешает отправку форм;
  • allow-popups — разрешает открывать всплывающие окна;
  • allow-top-navigation / allow-top-navigation-by-user-activation — навигация верхнего окна (полная или только по явному действию пользователя);
  • allow-popups-to-escape-sandbox — всплывающие окна без ограничений песочницы.

Покажу вам, как это реализовано на практике для встраивания виджета оплаты:

<iframe
  src="https://pay.example.com/widget"
  sandbox="allow-forms allow-scripts allow-same-origin"
  referrerpolicy="origin"
  title="Платежная форма">
</iframe>

Здесь:

  • мы разрешаем формы и скрипты, иначе виджет не заработает;
  • allow-same-origin нужен, если скриптам виджета нужно понимать свой домен;
  • при этом iframe все еще не может, к примеру, перенаправить верхнее окно.

allow и управление возможностями

Атрибут allow управляет конкретными API браузера:

<iframe
  src="https://example.com/call"
  allow="camera; microphone"
  title="Видео‑звонок">
</iframe>

Примеры параметров:

  • camera — доступ к камере;
  • microphone — доступ к микрофону;
  • geolocation — геолокация;
  • fullscreen — переход в полноэкранный режим;
  • clipboard-read, clipboard-write — буфер обмена.

Давайте посмотрим, что происходит в следующем примере:

<!-- Встраиваем видео с возможностью полноэкранного режима -->
<iframe
  src="https://www.youtube.com/embed/ID"
  allow="fullscreen; picture-in-picture"
  title="Видео с YouTube">
</iframe>

Без allow="fullscreen" кнопка полноэкранного режима может не работать.

referrerpolicy

referrerpolicy управляет тем, какой заголовок Referer будет отправлен при загрузке iframe.

Пример:

<iframe
  src="https://external.example.com/widget"
  referrerpolicy="no-referrer-when-downgrade"
  title="Внешний виджет">
</iframe>

Популярные значения:

  • no-referrer — не отправлять Referer вообще;
  • origin — отправлять только схему + домен (например, https://mysite.com);
  • strict-origin-when-cross-origin — более строгая политика по умолчанию в современных браузерах.

Это важно, если вы не хотите «светить» полный URL текущей страницы внешнему сервису.

loading

loading управляет ленивой загрузкой:

<iframe
  src="https://maps.google.com"
  loading="lazy"
  title="Карта с ленивой загрузкой">
</iframe>

Значения:

  • lazy — загрузка откладывается, пока iframe не приблизится к видимой области;
  • eager — загружать сразу;
  • auto — предоставить решение браузеру.

Используйте loading="lazy" для «тяжелых» виджетов (карты, видео), находящихся ниже первого экрана — это ускорит начальную загрузку страницы.

Адаптивные iframe и управление размерами

Процентная ширина

Самый простой способ сделать iframe гибким по ширине:

<iframe
  src="https://example.com"
  style="width: 100%; height: 400px; border: 0;"
  title="Адаптивная ширина">
</iframe>

Здесь width: 100% заставляет iframe растягиваться по ширине родительского контейнера.

Сохранение пропорций (под видео, карты)

Для видео и карт обычно нужно сохранить соотношение сторон (например, 16:9). Вот классический прием:

<div class="iframe-wrapper">
  <iframe
    src="https://www.youtube.com/embed/ID"
    title="Видео 16 к 9"
    allow="fullscreen"
    loading="lazy">
  </iframe>
</div>
.iframe-wrapper {
  position: relative;
  width: 100%;
  padding-bottom: 56.25%; /* 9 / 16 * 100 - высота 56,25% от ширины */
  height: 0;              /* высота контейнера определяется через padding-bottom */
  overflow: hidden;
}

.iframe-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;    /* iframe заполняет контейнер по ширине */
  height: 100%;   /* и по высоте */
  border: 0;      /* убираем рамку */
}

Как видите, этот код выполняет сразу две задачи:

  1. Контейнер устанавливает нужное соотношение сторон за счет padding-bottom.
  2. iframe растягивается внутри, подстраиваясь под эти пропорции.

Высота по содержимому: почему это сложно

Частый вопрос: «Как сделать, чтобы высота iframe автоматически подстраивалась под высоту содержимого?»

Сценарий зависит от домена:

Если содержимое с того же домена

Вы можете измерить высоту документа внутри iframe и выставить ее родительскому элементу:

<!-- Родительская страница -->
<iframe
  id="internalFrame"
  src="/inner-page.html"
  style="width: 100%; border: 0;"
  title="Внутренняя страница">
</iframe>

<script>
// Ждем загрузки iframe
document.getElementById('internalFrame').addEventListener('load', function () {
  // Здесь мы получаем доступ к документу внутри iframe
  var iframe = this;
  var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

  // Вычисляем высоту контента
  var height = innerDoc.documentElement.scrollHeight;

  // Устанавливаем высоту iframe под содержимое
  iframe.style.height = height + 'px';
});
</script>

Комментарии внутри кода помогают увидеть, как это работает:

  • мы ждем события load;
  • затем измеряем реальную высоту документа;
  • и подгоняем высоту iframe.

Если содержимое с другого домена

Здесь прямой доступ к contentDocument запрещен политикой одинакового источника. Высоту приходится узнавать через postMessage, если владелец внешнего ресурса это поддерживает. Мы еще вернемся к этому при разборе взаимодействия между окнами.

Взаимодействие через JavaScript

Доступ к содержимому iframe с того же домена

Если iframe загружает страницу того же домена, что и родитель, вы можете работать с DOM внутри фрейма:

<iframe
  id="infoFrame"
  src="/info.html"
  title="Информация">
</iframe>

<script>
// Получаем ссылку на iframe
var frame = document.getElementById('infoFrame');

// Ждем, когда он загрузится
frame.addEventListener('load', function () {
  // Здесь мы создаем переменную doc с документом внутри iframe
  var doc = frame.contentDocument || frame.contentWindow.document;

  // Находим элемент внутри iframe и меняем его текст
  var heading = doc.querySelector('h1');
  if (heading) {
    heading.textContent = 'Заголовок изменен из родительского окна';
  }
});
</script>

Обратите внимание:

  • все это работает только при одинаковом происхождении (протокол, домен, порт);
  • если домены различаются, попытка доступа выбросит ошибку безопасности.

Доступ к родительскому окну из iframe

Внутри iframe вы можете обратиться к родителю через window.parent:

<!-- Внутри документа, загруженного в iframe -->
<button id="sendBtn">Сообщить родителю</button>

<script>
document.getElementById('sendBtn').addEventListener('click', function () {
  // Здесь мы вызываем функцию родителя, если она существует
  if (window.parent && typeof window.parent.onChildMessage === 'function') {
    window.parent.onChildMessage('Кнопка внутри iframe была нажата');
  }
});
</script>

На родительской странице:

<script>
// Функция, доступная для iframe
function onChildMessage(message) {
  // Выводим сообщение из iframe
  console.log('Сообщение из iframe -', message);
}
</script>

Такой подход снова возможен только при одинаковом домене или при снятых ограничениях одинакового источника (что делать небезопасно).

Безопасное взаимодействие между доменами через postMessage

Когда домены различаются, правильный способ общения — window.postMessage.

Отправка сообщения из iframe родителю

Внутри iframe:

<script>
// Отправляем сообщение родительскому окну
function notifyParent() {
  // Здесь мы формируем данные для отправки
  var data = {
    type: 'resize',
    height: document.documentElement.scrollHeight
  };

  // Отправляем объект данных
  window.parent.postMessage(data, '*'); // '*' для примера - в реальности лучше указать конкретный origin
}

window.addEventListener('load', notifyParent);
window.addEventListener('resize', notifyParent);
</script>

Комментарии:

  • мы считаем высоту документа и отправляем ее наружу;
  • здесь '*' означает «любому получателю», но в боевом коде лучше указать точный origin родителя.

Обработка сообщений в родительском окне

На родительской странице:

<iframe
  id="externalFrame"
  src="https://widget.example.com/embed"
  style="width: 100%; border: 0;"
  title="Внешний виджет">
</iframe>

<script>
var frame = document.getElementById('externalFrame');

window.addEventListener('message', function (event) {
  // Проверяем источник сообщения для безопасности
  if (event.origin !== 'https://widget.example.com') {
    return; // Игнорируем сообщения с других доменов
  }

  // Здесь мы получаем объект данных от iframe
  var data = event.data;

  if (data && data.type === 'resize' && typeof data.height === 'number') {
    // Меняем высоту iframe в соответствии с данными
    frame.style.height = data.height + 'px';
  }
});
</script>

Здесь:

  • мы слушаем события message у window;
  • проверяем event.origin, чтобы не обрабатывать сообщения от неизвестных источников;
  • получаем данные и меняем высоту iframe.

Так обычно реализуют «автоматическую высоту» для встраиваемых виджетов.

Сценарии использования iframe

Встраивание видео

Самый распространенный пример — видео с YouTube или других платформ. Давайте разберемся на примере:

<div class="video-wrapper">
  <iframe
    src="https://www.youtube.com/embed/VIDEO_ID"
    title="Название видео"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"
    loading="lazy">
  </iframe>
</div>
.video-wrapper {
  position: relative;
  width: 100%;
  max-width: 800px;
  margin: 0 auto;
  padding-bottom: 56.25%; /* 16:9 */
  height: 0;
}

.video-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

Здесь мы:

  • делаем видео адаптивным;
  • разрешаем нужные возможности через allow;
  • включаем ленивую загрузку.

Встраивание карт

Многие картографические сервисы предлагают embed‑код на основе iframe:

<iframe
  src="https://www.google.com/maps/embed?pb=..."
  width="600"
  height="450"
  style="border:0;"
  loading="lazy"
  referrerpolicy="no-referrer-when-downgrade"
  title="Карта офиса">
</iframe>

Часто достаточно взять готовый код и немного адаптировать под свой макет (проценты по ширине, адаптивное соотношение сторон).

Встраивание виджетов и форм

Виджеты оплаты, виджеты входа соцсетей, онлайн‑чаты — все они часто поставляются именно как iframe, чтобы изолировать сторонний код.

Пример платежного виджета:

<iframe
  src="https://secure.payments.com/widget?public_key=..."
  sandbox="allow-forms allow-scripts allow-same-origin"
  referrerpolicy="origin"
  style="width: 100%; height: 500px; border: 0;"
  title="Платежная форма">
</iframe>

Такая изоляция полезна:

  • сторонний JS не ломает ваш сайт;
  • платежная система не раскрывает свои внутренности;
  • вы не храните у себя чувствительные данные карт.

Встраивание внутренних админ‑панелей

Иногда удобно использовать iframe для админских разделов или встроенных приложений:

  • у вас есть отдельное приложение с собственной авторизацией;
  • вы встраиваете его в общий портал через iframe;
  • таким образом сохраняете независимые релизы и стек технологий.

Внутренний сценарий:

<iframe
  src="https://admin.internal.local/dashboard"
  style="width: 100%; height: 100vh; border: 0;"
  title="Административная панель">
</iframe>

Здесь важно:

  • корректно настроить заголовки безопасности (CSP, X-Frame-Options);
  • продумать SSO или cookie‑авторизацию.

Безопасность при использовании iframe

X-Frame-Options и CSP frame-ancestors

Когда вы встраиваете чужой контент, вы подчиняетесь его настройкам безопасности:

  • X-Frame-Options: DENY — сайт вообще запрещает себя встраивать;
  • X-Frame-Options: SAMEORIGIN — разрешает только в рамках того же домена;
  • Content-Security-Policy: frame-ancestors ... — более гибкая политика, указывает, кто может встраивать ресурс.

Если вы управляете сервером своего контента, то этими заголовками вы решаете, может ли кто‑то встраивать вашу страницу в iframe.

Clickjacking и защита

Clickjacking — атака, когда злоумышленник встраивает ваш сайт в iframe, делает его прозрачным и заставляет пользователя кликать «по вашему сайту», не понимая этого.

Чтобы защититься:

  • запрещайте встраивание вообще или ограничивайте круг доменов;
  • используйте X-Frame-Options: SAMEORIGIN или DENY;
  • или Content-Security-Policy: frame-ancestors 'self' https://trusted.com.

Ограничение возможностей через sandbox и allow

Если вы встраиваете чужой контент, дополнительно:

  • максимально включайте sandbox;
  • точечно разрешайте только то, что критично для работы виджета;
  • используйте referrerpolicy для уменьшения утечки информации.

Например:

<iframe
  src="https://external-widget.com/..."
  sandbox="allow-scripts allow-same-origin"
  referrerpolicy="origin"
  loading="lazy"
  title="Внешний виджет в песочнице">
</iframe>

Здесь вы:

  • не позволяете виджету менять окно верхнего уровня;
  • не даете открывать всплывающие окна;
  • ограничиваете доступ к форме и другим потенциально опасным действиям.

Смешанный контент (HTTP в HTTPS)

Если ваш сайт отдается по HTTPS, а вы встраиваете iframe по HTTP, браузер может заблокировать такой iframe как небезопасный смешанный контент.

Рекомендации:

  • всегда используйте HTTPS‑версии ресурсов;
  • не полагайтесь на протокол «по умолчанию», прописывайте https явно;
  • проверяйте консоль разработчика на предупреждения о mixed content.

Лучшие практики использования iframe

Когда iframe — хорошее решение

Используйте iframe, когда:

  • вам нужно безопасно встроить сторонний функционал (оплата, чат, виджет);
  • вы хотите отделить крупное приложение или админку от основного сайта;
  • вы встраиваете ресурс, над которым не имеете контроля (видео‑плеер, карта, соцсеть);
  • важна изоляция JavaScript и стилей.

Когда iframe — плохое решение

Старайтесь не использовать iframe:

  • для обычной навигации по вашему же сайту (лучше делать SPA или обычную навигацию);
  • чтобы скрыть архитектурные проблемы (например, «обернуть» старый сайт в новый);
  • для небольших компонентов, которые можно реализовать нативно или через JS‑виджеты.

Проблемы iframe:

  • сложная коммуникация между окнами;
  • проблемы с SEO (поисковик видит страницу, но не обязательно интерпретирует содержимое фрейма как часть сайта);
  • возможные трудности с доступностью;
  • ограничения политики одинакового источника.

Рекомендации по производительности

  • используйте loading="lazy" для тяжелых фреймов ниже первого экрана;
  • не встраивайте десятки iframe на одной странице без необходимости;
  • следите за весом и временем загрузки внешних виджетов — они влияют на ваш сайт;
  • по возможности используйте статические изображения‑заглушки и загружайте iframe только по клику (например, для видео).

Пример отложенной загрузки по клику:

<button id="loadVideoBtn">Показать видео</button>
<div id="videoContainer"></div>

<script>
document.getElementById('loadVideoBtn').addEventListener('click', function () {
  // Здесь мы создаем iframe только в момент клика
  var iframe = document.createElement('iframe');
  iframe.src = 'https://www.youtube.com/embed/VIDEO_ID';
  iframe.title = 'Видео';
  iframe.allow = 'fullscreen';
  iframe.style.border = '0';
  iframe.style.width = '560px';
  iframe.style.height = '315px';

  document.getElementById('videoContainer').appendChild(iframe);
  this.style.display = 'none'; // скрываем кнопку после загрузки
});
</script>

Заключение

Элемент iframe в HTML — это мощный инструмент, который позволяет встраивать независимые веб‑страницы внутрь вашего сайта. Он предоставляет:

  • изоляцию контента на уровне DOM, JS и стилей;
  • возможность интеграции сторонних сервисов без глубокого вмешательства в их код;
  • гибкие настройки безопасности через sandbox, allow, referrerpolicy и серверные заголовки.

Вместе с тем, у iframe есть ограничения:

  • политика одинакового источника усложняет взаимодействие;
  • нужно аккуратно относиться к безопасности и защите от clickjacking;
  • чрезмерное использование фреймов может ухудшить производительность и усложнить архитектуру фронтенда.

Теперь вы видите, как iframe применяют для видео, карт, платежей, виджетов и внутренних приложений, и чем сопровождается грамотное использование: от адаптивной верстки до безопасного обмена сообщениями через postMessage. Опираясь на эти подходы, вы сможете интегрировать внешние и внутренние сервисы в свои проекты аккуратно и предсказуемо.

Частозадаваемые технические вопросы по iframe

Как скрыть полосы прокрутки внутри iframe, если у меня нет доступа к коду страницы внутри?

Скрыть именно содержимое вы не сможете без контроля над ним. Но можно ограничить видимую область:

  1. Задайте фиксированную высоту и overflow: hidden для самого iframe: css iframe.no-scroll { width: 100%; height: 300px; border: 0; overflow: hidden; }
  2. Примените класс no-scroll к нужному iframe. Это не уберет прокрутку внутри документа, но «обрежет» видимую часть.

Почему мой iframe не отображается в полноэкранном режиме даже при вызове requestFullscreen?

Нужно выполнить несколько шагов:

  1. На стороне iframe вызвать element.requestFullscreen() по пользовательскому действию (клик).
  2. На стороне родителя в iframe указать: html <iframe src="..." allow="fullscreen" title="..." ></iframe>
  3. Убедитесь, что браузер разрешает полноэкранный режим с этого домена. Без атрибута allow="fullscreen" многие браузеры блокируют переход в fullscreen.

Как передать токен авторизации из родительского окна в iframe с другого домена?

Используйте postMessage:

  1. После загрузки iframe отправьте токен: js const frame = document.getElementById('remote'); frame.addEventListener('load', () => { frame.contentWindow.postMessage( { type: 'auth', token: '...' }, 'https://remote.example.com' ); });
  2. Внутри iframe: js window.addEventListener('message', (event) => { if (event.origin !== 'https://parent.example.com') return; if (event.data.type === 'auth') { const token = event.data.token; // Используем токен для запросов } }); Всегда проверяйте event.origin, чтобы не принять данные от неизвестного источника.

Как запретить пользователям моего сервиса встраивать мои страницы в iframe на своих сайтах?

Настройте заголовки на сервере:

  1. Простой вариант:
    • X-Frame-Options: SAMEORIGIN — разрешает встраивание только с вашего домена;
    • или DENY — запрещает полностью.
  2. Современный вариант:
    • Content-Security-Policy: frame-ancestors 'self'; Это предотвратит загрузку вашего сайта внутри iframe на чужих доменах.

Как безопасно показывать страницу другого домена, чтобы она не могла перенаправить пользователя с моего сайта?

Используйте sandbox без разрешения навигации:

<iframe
  src="https://external.example.com"
  sandbox="allow-scripts allow-same-origin"
  title="Просмотр внешней страницы">
</iframe>

Здесь страница сможет выполнять свои скрипты, но:

  • не сможет менять top.location;
  • не сможет открыть новые окна (если не указать allow-popups);
  • останется в изолированной песочнице.
Стрелочка влевоТег object в HTML - как встраивать сторонний контент и управлять имТег embed в HTML - как встраивать внешние ресурсы на страницуСтрелочка вправо

Постройте личный план изучения Html до уровня Middle — бесплатно!

Html — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Html

Тег section в HTML - семантическая разметка структуры страницыТег nav в HTML - полное руководство по семантической навигацииТег main в HTML - подробное руководство по использованиюТег header в HTML - полное практическое руководствоТег footer в HTML - назначение семантика и практические примерыТег figure в HTML - как правильно оформлять иллюстрации и подписиТег figcaption в HTML - подробное руководство с примерамиТег aside в HTML - назначение правильная семантика и примеры
Текстовая область HTML textarea - практическое руководствоВыпадающий список HTML select - полное руководство для разработчиковОпция списка HTML option - как работает и как правильно использоватьАтрибут method в HTML - как правильно отправлять данные формыЗаголовок группы HTML legend - как правильно использовать и оформлятьТег input в HTML - типы атрибуты валидация и примерыТег формы form в HTMLГруппа полей HTML fieldsetАтрибут action в HTML - как правильно задавать адрес отправки формы
Открыть базу знаний

Лучшие курсы по теме

изображение курса

HTML и CSS

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий