Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Detect "allow-top-navigation" in iframe (https://javascript.ru/forum/misc/67559-detect-allow-top-navigation-iframe.html)

ruslan_mart 24.02.2017 09:50

Detect "allow-top-navigation" in iframe
 
Доброго времени суток, коллеги!

Есть у кого-нибудь идеи, как можно определить внутри iframe, что ему разрешено менять top.location? Т.е. либо не выставлен вообще sandbox, либо выставлен с "allow-top-navigation".

"allow-scripts" легко детектится с помощью document.domain. А вот с "allow-top-navigation" появились проблемы.

Конечно же, на ум сразу пришла такая идея:

try {
    window.top.location.href = 'http://google.ru';
}
catch(e) {
    console.log(false);
}


Но в этом случае, при "allow-top-navigation" будет происходить редирект. Мне же нужно просто узнать, можно ли сделать редирект в top, и в зависимости от этого отправить нужный параметр аяксом на сервер.

Ещё была идея:

try {
    window.top.location.hash = Math.random().toString(16);
}
catch(e) {
    console.log(false);
}


Но родителю, в лучшем случае, можно менять только href (или весь location целиком).

Буду благодарен за советы. :)

ruslan_mart 24.02.2017 11:52

Ни у кого нет каких-нибудь идей?

ruslan_mart 24.02.2017 13:42

Rise, понятное дело. Тут именно идёт речь о наличии такого параметра в sandbox, ведь sandbox может вообще не стоять и скрипты при этом также будут работать.

Теперь появилась необходимость определить наличие параметра "allow-top-navigation" в sandbox, какими-нибудь хитрыми способами.

ruslan_mart 24.02.2017 14:13

Rise, детектится.

При sandbox="allow-scripts", document.domain выдаст пустую строку. Без sandbox выдаёт родительский домен.

function isSandboxed() {
	var frame;

	if(window !== window.parent) {
		try {
			frame = window.frameElement;
		}
		catch(e) {
			frame = null;
		}

		if(frame === null) {
			if(document.domain === '' && window.location.protocol !== 'data:') {
				return true;
			}
		}
	}

	return !!frame && frame.hasAttribute('sandbox');
}

ruslan_mart 24.02.2017 14:32

Rise, ой, не то написал, всё верно. Имел ввиду, что document.domain без sandbox выдаст домен фрейма, а с sandbox - пустую строку.

ruslan_mart 24.02.2017 17:28

Видимо, мой вопрос всё-таки не решим, как я и предполагал. :)


Часовой пояс GMT +3, время: 14:15.