Почему разделители кадров работают междоменно, и вы можете условно использовать разделители кадров? - PullRequest
10 голосов
/ 04 июня 2009

Я недавно исследовал код взлома фреймов кода и натолкнулся на какое-то странное поведение, связанное с политикой того же происхождения , которое мне трудно понять.

Предположим, у меня есть страница 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, но только если она находится в том же домене, что и его родитель (или в настроенном допустимом домене). Тем не менее, кажется, что это невозможно определить, поскольку та же политика происхождения запрещает мне доступ к местоположению родителя.

Итак, у меня есть два вопроса, в основном:

  1. Почему вышеуказанный код прерывателя кадра работает вообще?

  2. Есть ли способ условно разбить кадры, или единственная проверка, которую можно сделать, это top !== self? (В частности, я хочу иметь возможность читать домен, чтобы я мог предоставить список допустимых доменов; просто проверка того, нахожусь ли я в одном домене или нет, не будет идеальной.)

Ответы [ 3 ]

1 голос
/ 04 июня 2009

ДЛЯ ВАШЕГО ОТВЕТА НА 1: С точки зрения безопасности, существует большая разница между доступом для чтения и доступом для записи. Возможность чтения top.location.href является проблемой безопасности. Возможность писать в top.location.href - это не так.

Что касается ответа на ваш вопрос, я не знаю javascript достаточно хорошо, чтобы быть уверенным, но одна идея состоит в том, чтобы предположить, что если чтение top.location не удается (проверьте наличие исключений), оно находится в другом домене.

0 голосов
/ 29 сентября 2014

Это для вопроса № 2: Если вы хотите получить HREF parent.location (не top.location), вы можете сделать это:

if ((window.top === window.parent) && (history.length==1)) parentHREF=document.referrer;

В основном этот код выполняет следующие действия:
[1] Проверка, является ли родительский фрейм верхним, поскольку вы можете использовать только HREF родительского фрейма, даже если он не является верхним фреймом.
[2] Проверка, была ли история iframe пустой перед загрузкой его источника, потому что если нет ... document.referrer вернет последний HREF в этой истории фреймов.

После этого у вас есть новая проблема: если значение history.length больше единицы, вы можете использовать белый список имен хостов, чтобы проверить, нужно ли его открывать или нет:

if ([location.hostname, 'stackoverflow.com'].indexOf(location.hostname)>=0) hasToBeOpened=true;

Обратите внимание, что у вас есть другой вариант: вы можете использовать целевую страницу, чтобы проверить, открывать или нет "первую" страницу, используйте этот код:

<head>
<script>
var parentHREF;
if ((window.top === window.parent) && (history.length==1)) parentHREF=document.referrer;
if (/*conditions mentiones above*/) document.write("<META http-equiv='refresh' content='0;URL=http://example.com/go-here.html'>");
</script>
</head>

Делая это таким образом, «первая» страница заменит первое в истории (в данном случае первое) значение. Этот код предполагает, что example.com является вашим доменом.

0 голосов
/ 04 июня 2009

Ответ на вопрос 1 заключается в том, что оператор равенства может использоваться против top.location.href по устаревшим причинам. Breaker.html не может прочитать top.location.href, но может сравнить его с другим значением.

Тогда ответом на вопрос 2 становится «нет», вы должны использовать! == для разделения, потому что вы не сможете сделать подстроку в top.location.href из междоменного breaker.html.

Я могу ошибаться, но это мое понимание текущего мира iframe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...