Предотвращение перебора кадров с доступом к источнику страницы
Итак, мы загружаем страницу в iframe. Эта дочерняя страница загружается из кэша в том же домене, что и родительский. Однако внешние ресурсы не кэшируются локально и загружаются с внешнего сайта, включая javascript. На одном сайте у нас есть код перебора кадров:
if (top.location != self.location) {
top.location = self.location
}
Теперь я знаю, что мы могли бы использовать решение от Coderr, но я не уверен, каковы последствия / стук в проблемах. Учитывая, что у нас есть доступ к кешированной дочерней странице, мне интересно, есть ли что-нибудь, что мы можем добавить к дочернему элементу, чтобы переопределить какие-либо методы или значения, чтобы сделать нулевым сброс фрейма. Например, в <head>
ребенка я попытался добавить это:
<script type="text/javascript">
top.location = self.location
</script>
а также
self.location = top.location
с довольно ужасными результатами (бесконечное вложение в первом примере, полное и полное падение браузера во втором).
Есть ли какие-либо предложения для кода, который мы могли бы добавить к дочернему элементу, чтобы аннулировать удаление фреймов?
Иначе, мы должны будем кэшировать js и разобрать / заменить скрипт framebusting.
Спасибо
Р.
И пожалуйста - это законно!!
2 ответа
Недавно я натолкнулся на очень интересную статью Джеффа Этвуда, в которой он говорит о "невозможном" противодействии методам снятия фреймов:
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
Это даже не требует привилегированного доступа к коду дочернего фрейма!
Простая замена текста с помощью Tampermonkey
document.body.innerHTML = document.body.innerHTML.replace(/original/g,"new");
Если вы используете версию регулярного выражения (замените все вхождения в документе), вам нужно экранировать специальные символы, такие как /
а также "
с \
условное обозначение.
Чтобы заменить только одно вхождение:
var find = "if (top.location!=location) { top.location.href = location.href; }";
replace = "";
document.body.innerHTML = document.body.innerHTML.replace(find,replace);
Это не будет работать на страницах, которые имеют <script>
на самом верху, вверх головой.
Удостовериться @run-at document.start
установлено.