JavaScript window.opener — вікно, що відкрило поточне
Властивість opener посилається на вікно, яке відкрило поточне — через window.open() або посилання з target="_blank".
Загальний опис
Це та властивість, навколо якої свого часу вибухнув скандал безпеки. Сторінка, відкрита через target="_blank", отримувала посилання на твою — і могла підмінити її адресу: opener.location = 'фішинговий-сайт'. Користувач повертався на вкладку й бачив підроблену форму входу, впевнений, що це той самий сайт.
Сьогодні браузери за замовчуванням додають noopener до target="_blank", і opener там дорівнює null. Але для window.open() це треба вказувати явно.
Легальне застосування в нього одне: спливаюче вікно OAuth, яке після входу повідомляє батьківську сторінку через postMessage() і закривається.
- Нотатка
-
Відкриваєш чуже посилання через
автор: NagarDwindow.open()— завжди передавай'noopener'. Інакше чужа сторінка зможе переписати адресу твоєї.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| opener | 1+ | 1+ | 1+ | 3+ | 12+ | 5+ |
| Переглядач | ||||
|---|---|---|---|---|
| opener | yes | yes | yes | yes |
Приклади
+ запропонувати свій приклад у пісочниці
Спливаюче вікно входу, що повідомляє батька й закривається.
// --- батьківська сторінка ---
const popup = window.open('/oauth/google', 'oauth', 'width=500,height=600');
window.addEventListener('message', event => {
if (event.origin !== location.origin) {
return;
}
if (event.data.type === 'oauth-done') {
location.reload();
}
});
// --- усередині спливаючого вікна ---
if (window.opener) {
window.opener.postMessage({ type: 'oauth-done' }, location.origin);
window.close();
}
// чуже посилання — ЗАВЖДИ з noopener
window.open('https://example.com', '_blank', 'noopener');
Коментарі
Коментарів ще немає — будьте першим!