Я недавно изучал фрейм, разбивающий код, и столкнулся с каким-то действительно странным поведением, связанным с та же самая политика происхождения, что у меня возникли проблемы с пониманием.
Предположим, у меня есть страница Breaker.html в домене A и страница Container.html в домене B. Примерный код разлома фрейма в Breaker.html, как показано ниже:
if (top !== self) top.location.href = self.location.href;
Это успешно сломает Breaker.html из Container.html, но я не понимаю, зачем это нужно. Из моего чтения той же политики происхождения, top.location
не должен быть доступен вообще, поскольку Container.html находится в другом домене, чем Breaker.html. Даже более странно, кажется, что top.location только для записи:
// Fails if Container.html is on a different domain than Breaker.html
alert(top.location);
Это проблематично для меня, потому что я пытаюсь написать код, который позволяет моей странице находиться в iframe, но только если он находится в том же домене, что и его родительский элемент (или находится в настроенном разрешенном домене). Однако это невозможно определить, так как одна и та же корневая политика запрещает мне доступ к родительскому местоположению.
Итак, у меня есть два вопроса, в основном:
-
Почему код выше этого кода работает вообще?
-
Есть ли способ разорвать фреймы условно или это единственная проверка, которую можно сделать, - это
top !== self
? (В частности, я хочу иметь возможность читать домен, чтобы я мог предоставить список допустимых доменов, просто проверяя, находится ли я в том же домене или нет, не будет идеальным.)