Допустим, вы не хотите, чтобы другие сайты «вставляли» ваш сайт в <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, поэтому вот мой вызов для вас: эй, бастер, можешь ли ты уничтожить бастера?
example.org
как указано в RFC 2606. Ietf.org/rfc/rfc2606.txt