Ошибка безопасности из разных источников при перемещении приложения на поддомен (2018) - PullRequest
0 голосов
/ 11 декабря 2018

Справочная информация: у нас есть платформа, которая работает на https://system.example.com.Эта платформа состоит из 10 отдельных веб-приложений (все написаны на PHP и JS).Исторически каждое приложение находилось в подкаталоге одного и того же поддомена:

Мы находимся в процессе перестройки одного из приложений, app2, и решили разместить его на новом отдельном поддомене, https://app2.example.com.

* 1020.* Часть приложения app2 использует JavaScript, чтобы открыть всплывающее окно для app10.Большая часть функциональности в этом всплывающем окне работает, как и ожидалось.Тем не менее, при попытке использовать кнопку «Сохранить» во всплывающем окне консоли моего браузера отображалось:

Uncaught DOMException: заблокирован фрейм с источником «https://app2.example.com" от доступа к кросс-источникуframe. at https://system.example.com/app10/manage.php:1:334

Я прочитал оба SecurityError: Заблокирован фрейм с источником из-за доступа к фрейму перекрестного происхождения и https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage, но все еще неясно, каккак это исправить.

Код и процесс, который я имею, выглядит следующим образом:

Всплывающее окно открывается из https://app2.example.com кнопкой, которая имеет обработчик событий onclick:

<button onclick="postToPopUp('https://system.example.com/app10/manage.php', 'fileManage', 'width=800px,height=600px', ['f_id', '123'], 'app2', 'filesCallbackManage')">Open app10</button>

Функция postToPopup() используется для передачи данных POST из app2 в https://system.example.com/app10/manage.php на основе Передачи значений Javascript window.open с использованием POST - это прекрасно работает.

Проблема возникает, когда я нажимаю кнопку «Сохранить» внутри всплывающего окна, которое отображает следующую разметку во всплывающем окне:

<!doctype HTML><html><head><title>upload</title>
<script type="text/javascript" language="javascript" charset="utf-8">
var fileObject = {"files":{"0":{"f_id":"1784","f_title":"test07.pdf"},"f_id":123}};
window.opener.filesCallbackManage(fileObject);
window.close();
</script><body></body></html>

Что это было сделано изначально - когда все было в одном поддомене - былоназывается функция JS filesCallbackManage(), которыйh состоял в коде для https://system.example.com/app2.Самой функции был передан объект fileObject, который обновлял различные части пользовательского интерфейса внутри app2.После нажатия кнопки «Сохранить» всплывающее окно было закрыто из-за window.close();

Хотя я читал об использовании postMessage Я не понимаю, как это подходит, или это даже правильное решение моей проблемы?Данные отправляются с субдомена https://app2.example.com на https://system.example.com/app10 правильно.Проблема в том, что filesCallbackManage() не сработает из-за ограничения перекрестного происхождения.Внутри моего кода для https://app2.example.com у меня есть простое утверждение, чтобы увидеть, запускается ли оно:

function filesCallbackManage(data)
{
    console.log('filesCallbackManage has fired');
}

Это никогда не срабатывает из-за моей проблемы.Я получаю ошибку консоли, упомянутую ранее, и пустое всплывающее окно (технически это правильно, поскольку в теге <body> в разметке выше ничего нет), но окно не закрывается и обратный вызов не запускается.

Пример, приведенный на веб-сайте Mozilla, недостаточно широк, чтобы понять, как его можно адаптировать к сценарию такого типа.Пожалуйста, кто-нибудь может уточнить?Кроме того, связанному посту переполнения стека исполнилось четыре года, поэтому я хочу быть уверенным, что все, что я надену, является безопасным и актуальным.

1 Ответ

0 голосов
/ 23 декабря 2018

Функция postToPopup () используется для передачи POST-данных

Подача формы через источник данных - это нормально.Таким образом, вы можете сделать это.

Проблема возникает, когда я нажимаю кнопку «Сохранить» внутри всплывающего окна

Вы пытаетесь получить доступ к DOM окна черезпроисхождение.Это запрещено.

Хотя я читал об использовании postMessage, я не понимаю, как это подходит или это даже правильное решение моей проблемы?

postMessage настолько близко, насколько вы можете получить доступ к DOM окна через источник.

Вы не можете сделать это.

var fileObject = {"files":{"0":{"f_id":"1784","f_title":"test07.pdf"},"f_id":123}};
window.opener.filesCallbackManage(fileObject);

Вместо этогоВы должны отправить сообщение:

window.opener.postMessage(fileObject, "https://system.example.com");

и иметь код, который его прослушивает:

addEventListener("message", receiveMessage);

function receiveMessage(event) {
    if (event.origin !== "http://app2.example.com") { return false; }
    filesCallbackManage(event.data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...