Допустим, вы не хотите, чтобы другие сайты "вставляли" ваш сайт в <iframe>
:
<iframe src="http://example.org"></iframe>
Таким образом, вы вставляете антикадровый код JavaScript на всех фреймах:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Отлично! Теперь вы автоматически «перебираете» или выбрасываете любой содержащий iframe. За исключением одной маленькой проблемы.
Как выяснилось, ваш код перебора кадров может быть отключен , , как показано здесь :
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
Этот код выполняет следующие действия:
- увеличивает счетчик каждый раз, когда браузер пытается отойти от текущей страницы, с помощью обработчика событий
window.onbeforeunload
- устанавливает таймер, который срабатывает каждую миллисекунду с помощью
setInterval()
, и, если он видит счетчик с приращением, меняет текущее местоположение на сервер управления атакующего
- этот сервер обслуживает страницу с HTTP-кодом состояния 204 , что не приводит к перемещению браузера в любом месте
Мой вопрос - и это больше загадка JavaScript, чем реальная проблема - как вы можете победить разрушителя фреймов?
У меня было несколько мыслей, но в моем тестировании ничего не получалось:
- попытка очистить событие
onbeforeunload
через onbeforeunload = null
не дала эффекта
- добавление
alert()
остановило процесс, чтобы пользователь знал, что это происходит, но никак не влияло на код; нажатие кнопки OK позволяет продолжить процесс как обычно
- Я не могу придумать, как очистить таймер
setInterval()
Я не очень-то программист на JavaScript, поэтому вот мой вызов для вас: Эй, Бастер, можешь уничтожить бастера?