#javascript #security #cross-domain #postmessage #window.location
#javascript #Безопасность #междоменный #postmessage #окно.Расположение
Вопрос:
При использовании postMessage важно определить targetOrigin, чтобы гарантировать, что мы не допустим утечки данных на другие сайты.
Не менее важно проверять источник при получении сообщения, чтобы другие сайты не запускали наши скрипты.
Но, если мы просто ожидаем сделать это в нашем собственном домене, есть ли что-то не так с:
targetWindow.postMessage({message}, window.origin);
—
window.addEventListener("message", e => {
if (e.origin == window.origin){
//Trigger something
}
});
Ответ №1:
Я не эксперт по безопасности, но MDN рекомендует проверять свойства сообщения origin
и, возможно source
, свойства. Итак, правильно проверить это, и мы можем считать это безопасным.
Теперь возникает вопрос:
Насколько безопасно сверять сообщения
origin
с окнамиorigin
?
Прежде всего, учтите, что есть 2 способа проверить origin
содержимое окна. Тот, который вы пытаетесь использовать, — WindowOrWorkerGlobalScope.origin альтернативный вариант — window.location.origin.
Я бы не стал использовать WindowOrWorkerGlobalScope.origin
, потому что он может быть перезаписан на стороне клиента. Попробуйте:
window.origin = 'https://www.example.com';
console.log(window.origin === 'https://www.example.com');
Я не думаю, что это прямая угроза безопасности (хотя я не эксперт по безопасности, как я уже говорил выше), но при определенных условиях это может упростить выполнение успешной атаки.
window.location.origin
может быть лучшим выбором, потому что он доступен только для чтения и не может быть изменен на стороне клиента. В качестве бонуса он имеет более широкую поддержку браузера.
Итак, я бы использовал window.location.origin
либо жесткий код URL, как показано в MDN.
Если жесткий URL-адрес кажется проблематичным из-за тестирования, вы можете использовать переменные среды, если в вашем проекте используются современные инструменты построения.
Комментарии:
1. Привет, Игорь, большое спасибо за сообщение. Я склоняюсь к тому, что если бы у кого-то был доступ к изменению window.origin в своем домене, то, я думаю, у них уже было бы достаточно доступа, чтобы нанести любой ущерб, который они пожелают! Если есть браузеры, которые поддерживают postMessage, а не window.origin, это было бы актуально. Я не могу найти таблицу поддержки. Можете ли вы? Я думаю, нам, вероятно, нужен эксперт по безопасности, чтобы точно знать, есть ли какие-либо причины не делать этого.
2. @JamieG если вам нужен совет по безопасности, возможно, есть лучшее место, где можно спросить
3. @Jamie G на самом деле вообще не требует компромисса. Вы можете использовать инструмент отладчика для внедрения скрипта, который выполняет это практически на любой странице.