Скажімо, ви не хочете, щоб інші сайти "обрамляли" ваш сайт у <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()
зупинений процес, дайте користувачеві знати, що це відбувається, але жодним чином не втручався в код; натискання кнопки "ОК" дозволяє продовжувати зйомки як завжди - Я не можу придумати жодного способу очистити
setInterval()
таймер
Я не дуже програміст JavaScript, тому ось моє завдання перед вами: ей, Бастер, чи можете ви перебити каркас?
example.org
зазначено в RFC 2606 ietf.org/rfc/rfc2606.txt