Скажем, вы не хотите, чтобы другие сайты "разорвали" ваш сайт в <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, так что вот моя задача для вас: Эй, бэттер, можете ли вы разбить бюст?