JavaScript postMessage() — обмін даними між вікнами й iframe
Метод postMessage() надсилає дані іншому вікну — вкладці, спливаючому вікну чи iframe, навіть із іншого домену.
Загальний опис
Політика одного джерела (same-origin) забороняє сторінкам із різних доменів лізти одна в одну. postMessage() — це офіційна щілина в цій стіні: єдиний легальний спосіб обмінятись даними.
Отримувач слухає подію message на своєму вікні. Дані приходять у event.data, а джерело — в event.origin.
І ось тут — найважливіше правило безпеки: event.origin треба перевіряти завжди. Без перевірки будь-який сайт, що відкрив твою сторінку в iframe, зможе надіслати їй команду й видати її за свою.
- Нотатка
-
Ніколи не довіряй
автор: NagarDevent.dataбез перевіркиevent.origin. Пропущена перевірка — це готова діра: чужа сторінка зможе керувати твоєю.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| postMessage | 1+ | 3+ | 4+ | 9.5+ | 12+ | 8+ |
| Переглядач | ||||
|---|---|---|---|---|
| postMessage | yes | yes | yes | yes |
Приклади
+ запропонувати свій приклад у пісочниці
Обмін між сторінкою та iframe — з обов'язковою перевіркою джерела.
HTML
<iframe>демо</iframe>
JS
// --- батьківська сторінка ---
const frame = document.querySelector('iframe');
frame.contentWindow.postMessage(
{ type: 'theme', value: 'dark' },
'https://widget.example.com' // кому саме — не '*'
);
// --- усередині iframe ---
window.addEventListener('message', event => {
// БЕЗ ЦЬОГО РЯДКА — діра в безпеці
if (event.origin !== 'https://css.in.ua') {
return;
}
if (event.data.type === 'theme') {
document.documentElement.dataset.theme = event.data.value;
}
});
Коментарі
Коментарів ще немає — будьте першим!