MiddleКодИногдаЕщё не отвечали
Исправьте небезопасный обработчик postMessage, чтобы он проверял отправителя и рендерил безопасно
Виджет получает данные профиля из родительского фрейма. В этом обработчике два клиентских дефекта безопасности.
Ограничения:
- управлять виджетом может только
https://app.example.com msg.name— обычный текст, введённый пользователем
window.addEventListener('message', (event) => {
const msg = JSON.parse(event.data);
document.getElementById('greeting').innerHTML = 'Hi, ' + msg.name;
});
Найдите и исправьте уязвимости.
Два дефекта. Обработчик не проверяет event.origin, поэтому управлять им может любое окно, и он пишет пользовательский текст в innerHTML — разбирающий sink. Сравните event.origin строго с https://app.example.com, выйдите при несовпадении и выводите через textContent.
- ✗Проверять
event.sourceили суффикс origin вместо точного совпадения origin - ✗Экранировать кавычки вместо отказа от разбирающего sink
- ✗Считать, что структурированный канал сообщений делает payload безопасным для
innerHTML
- →Почему ранний выход при несовпадении origin важнее, чем очистка значения?
- →Когда
textContentнедостаточно и лучше подойдут Trusted Types?
Оглавление
Дефекты
- Нет проверки отправителя.
postMessageможет прислать любое окно, открывшее ваш виджет во фрейме. Без сравненияevent.originчужая страница задаёт содержимое приветствия. - Разбирающий sink.
innerHTMLразбирает строку как разметку, поэтому подконтрольный пользователюmsg.nameпопадает в DOM как HTML — это DOM XSS.
Исправление
const ALLOWED_ORIGIN = 'https://app.example.com';
window.addEventListener('message', (event) => {
if (event.origin !== ALLOWED_ORIGIN) return; // 1. точное сравнение, ранний выход
let msg;
try { msg = JSON.parse(event.data); } catch { return; }
document.getElementById('greeting').textContent = 'Hi, ' + msg.name; // 2. текстовый sink
});
✅ Сравнение строгое (!==), а не по подстроке или суффиксу — https://app.example.com.evil.tld не пройдёт. ⚠️ Проверка event.source вместо origin не заменяет её: источник подделывается перестановкой окон.
Оглавление