Javascript window.opener.postMessage Cross Origin с несколькими поддоменами - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь разрешить несколько поддоменов при выполнении:

window.opener.postMessage(...);

Это работает, но это небезопасно, так как разрешены все возможные домены, и я не хочу этого:

window.opener.postMessage('MyMSG', '*');

Это работает для одного домена:

window.opener.postMessage('MyMSG', 'https://example.com');

Но что, если я хочу разрешить это: * .example.com?

Конечно, это:

window.opener.postMessage('MyMSG', '*.example.com');
window.opener.postMessage('MyMSG', 'https://*.example.com');
window.opener.postMessage('MyMSG', 'https://(.*)example.com');

не работает

Как правильно это сделать? Это вообще возможно?

Спасибо

1 Ответ

0 голосов
/ 24 августа 2018

targetOrigin ожидает * или точный URI, то есть без подстановочных знаков субдомена.

Если вы хотите публиковать сообщения для нескольких целей, вам потребуется отдельный вызов postMessage() для каждой.Чтобы сделать это проще, вы можете просто поместить все домены в список и выполнить итерацию по списку, вместо того, чтобы жестко кодировать каждый вызов.

var someData = {};
var subdomains = ["one","two","three"];
for(var subdomain of subdomains){
  let target = "http://"+subdomain+".example.com"
  window.postMessage(someData,target);
}

Но это связано с затратами на обслуживание обновления списка

Теперь, в зависимости от того, к какому концу у вашего кода, вы также можете использовать определенные методы для получения точного URI во время выполнения.В примерах примеров URL анализирует только протокол и хост, чтобы получить правильное значение для передачи в postMessage.

Если вы находитесь в конце, открывшем окно, или родительском элементе iframe, вы можете просто получить src, href или любое другое свойство, используемое для указания URL-адреса окна, iframe и т. д.

//if using for instance window.open()
//you already know the url as it has to be passed to the function
var target = window.open("http://example.com/some/path");

//so in this case you would first save the url to a variable and use that variable for both
var url = new URL("http://example.com/some/path");
var targetDomain = url.protocol + "//" + url.host;

var target = window.open(url.href);
target.postMessage("message",targetDomain);

//if using an iframe just grab the src property and parse the domain from that
var url = new URL(iframeElement.src);
var targetDomain = url.protocol+"//"+url.host;
iframeElement.contentWindow.postMessage("message",targetDomain);

Теперь, если вы находитесь на другой стороне, то есть в iframe илиВ открывшемся окне вы можете использовать document.referrer за исключением того, что открываете незащищенный URL с защищенной страницы.Значение document.referrer не будет установлено, когда вы открываете URL http://, когда ваша страница использует https://

var url = new URL( document.referrer );
var target = url.protocol+"//"+url.host;
//opened window
window.opener.postMessage("message",target);
//iframe
window.parent.postMessage("message",target);
...