Допустим, вы не хотите, чтобы другие сайты «вставляли» ваш сайт в <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, поэтому вот мой вызов для вас: эй, бастер, можешь ли ты уничтожить бастера?
javascript
html
iframe
framebusting
Джефф Этвуд
источник
источник
example.org
как указано в RFC 2606. Ietf.org/rfc/rfc2606.txtОтветы:
Я не уверен, является ли это жизнеспособным или нет - но если вы не можете разбить кадр, почему бы просто не отобразить предупреждение. Например, если ваша страница не является «верхней страницей», создайте метод setInterval, который пытается разбить фрейм. Если после 3 или 4 попыток ваша страница все еще не является верхней страницей - создайте элемент div, который покрывает всю страницу (модальное поле) сообщением и ссылкой, например ...
Не самый лучший, но я не вижу способа, которым они могли бы написать свой выход из этого.
источник
document.write("");
(после того, как вы установили, что это подставленоFWIW, большинство современных браузеров поддерживают на X-Frame-Options: запретить директиву, которая работает даже тогда , когда скрипт отключен.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
источник
Мы использовали следующий подход на одном из наших сайтов по адресу http://seclab.stanford.edu/websec/framebusting/framebust.pdf
источник
Придумал это, и, похоже, работает, по крайней мере, в Firefox и браузере Opera.
источник
onbeforeunload
обработчики, а не только один сверху!Принимая во внимание текущий стандарт HTML5, который ввел «песочницу» для iframe, все коды очистки фреймов, представленные на этой странице, могут быть отключены, когда злоумышленник использует «песочницу», потому что это ограничивает iframe следующим:
Пожалуйста, смотрите: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Теперь предположим, что злоумышленник использовал следующий код для размещения вашего сайта в iframe:
Тогда весь код разрыва фрейма JavaScript потерпит неудачу.
После проверки всех кадровых кодов кадров только эта защита работает во всех случаях:
что первоначально предложено Густавом Ридстедтом, Эли Бурштейном, Даном Бонех и Коллином Джексоном (2010)
источник
Подумав немного, я верю, что это покажет им, кто в доме хозяин ...
Использование
_top
в качестве целевого параметра дляwindow.open()
запускает его в том же окне.источник
источник
Я собираюсь быть смелым и бросить свою шляпу в кольцо на этом (старое как оно есть), посмотрите, сколько отрицательных голосов я могу собрать.
Вот моя попытка, которая, кажется, работает везде, где я ее тестировал (Chrome20, IE8 и FF14):
Я поместил этот код в
<head>
и вызвал его в конце,<body>
чтобы убедиться, что моя страница отображается, прежде чем она начнет спорить со злонамеренным кодом, не знаю, является ли это лучшим подходом, YMMV.Как это работает?
... Я слышал, вы спрашиваете - ну, честный ответ, я не совсем знаю. Потребовалось много усилий, чтобы заставить его работать везде, где я тестировал, и точный эффект, который он имеет, немного варьируется в зависимости от того, где вы его запускаете.
Вот мысль за этим:
Для моего
http://mysite.tld/page-that-takes-a-while-to-load
(цель XHR) я использовал скрипт PHP, который выглядит следующим образом:Что просходит?
Разве вы не можете избежать времени ожидания в Chrome и Firefox?
Очевидно нет. Сначала я указал XHR на URL, который вернул бы 404 - это не сработало в Firefox. Затем я попробовал
sleep(5);
подход, который я в конечном итоге получил для этого ответа, затем я начал играть с продолжительностью сна различными способами. Я не мог найти никакой реальной картины поведения, но обнаружил, что если она слишком короткая, то Firefox не будет играть в мяч (Chrome и IE, похоже, ведут себя довольно хорошо). Я не знаю, что такое определение «слишком короткий» в реальном выражении, но 5 секунд, кажется, работает каждый раз.Если какой-нибудь мимолетный ниндзя Javascript захочет немного лучше объяснить, что происходит, почему это (вероятно) неправильно, ненадежно, худший код, который они когда-либо видели, и т.д. Я с удовольствием выслушаю.
источник
С 2015 года вы должны использовать CSP2
frame-ancestors
для этого директиву . Это реализовано через заголовок ответа HTTP.например
Конечно, не многие браузеры поддерживают CSP2, поэтому стоит добавить старый
X-Frame-Options
заголовок:В любом случае, я бы посоветовал включить оба варианта, иначе ваш сайт будет по-прежнему уязвим к атакам Clickjacking в старых браузерах, и, конечно, вы получите нежелательные фреймы даже без злонамеренного намерения. В наши дни большинство браузеров обновляются автоматически, однако корпоративные пользователи по-прежнему склонны зацикливаться на старых версиях Internet Explorer по причинам совместимости с устаревшими приложениями.
источник
Итак, мы знаем, что были в кадре. Таким образом, мы location.href переходим к другой специальной странице с путем в качестве переменной GET. Теперь мы объясним пользователю, что происходит, и предоставим ссылку с параметром target = "_ TOP". Это просто и, вероятно, сработает (еще не проверял), но требует некоторого взаимодействия с пользователем. Может быть, вы могли бы указать на сайт оскорбительного пользователя и сделать так, чтобы где-нибудь на вашем сайте было много позоров ... Просто идея, но это работает ночью ..
источник
Все предложенные решения напрямую форсируют изменение местоположения верхнего окна. Что, если пользователь хочет, чтобы кадр был там? Например, верхний фрейм в изображении результатов поисковых систем.
Я написал прототип, в котором по умолчанию все входы (ссылки, формы и элементы ввода) отключены и / или ничего не делают при активации.
Если обнаружен содержащий кадр, входы остаются отключенными, и в верхней части страницы отображается предупреждающее сообщение. Предупреждающее сообщение содержит ссылку, которая откроет безопасную версию страницы в новом окне. Это предотвращает использование страницы для перехвата кликов, в то же время позволяя пользователю просматривать содержимое в других ситуациях.
Если содержащий кадр не обнаружен, входы активируются.
Вот код Необходимо установить стандартные атрибуты HTML на безопасные значения и добавить дополнительные атрибуты, которые содержат фактические значения. Вероятно, он неполон, и для полной безопасности дополнительные атрибуты (я думаю о обработчиках событий), вероятно, придется обрабатывать аналогичным образом:
источник
Ну, вы можете изменить значение счетчика, но это, очевидно, хрупкое решение. Вы можете загрузить свой контент через AJAX после того, как определили, что сайт находится за пределами фрейма - тоже не очень хорошее решение, но оно, надеюсь, позволяет избежать запуска события on beforeunload (я полагаю).
Изменить: еще одна идея. Если вы обнаружите, что находитесь в кадре, попросите пользователя отключить JavaScript, прежде чем щелкнуть ссылку, которая приведет вас к нужному URL-адресу (передав строку запроса, позволяющую вашей странице сообщить пользователю, что он может повторно включить JavaScript, когда они здесь).
Редактировать 2: Идите ядерным путем - если вы обнаружите, что находитесь в рамке, просто удалите содержимое тела документа и напечатайте какое-нибудь неприятное сообщение.
Редактировать 3: Можете ли вы перечислить верхний документ и установить все функции на ноль (даже анонимные)?
источник
<body>
внутри<plaintext>
тега в значениеdisplay: none
. Это довольно эффективно.Если вы добавите предупреждение сразу после кода ошибки, тогда предупреждение остановит поток JavaScript и позволит странице загрузиться. Это то, что делает StackOverflow, и он вылетает из моих фреймов, даже когда я использую бастер. Это также работало с моей простой тестовой страницей. Это было проверено только в Firefox 3.5 и IE7 на Windows.
Код:
источник
Я думаю, что вы были почти там. Ты пытался:
или, альтернативно:
Примечание: я на самом деле не проверял это.
источник
А как насчет вызова бастера, а также несколько раз? Это создаст условия гонки, но можно надеяться, что бастер выйдет победителем:
источник
Если вы посмотрите на значения, возвращаемые
setInterval()
как правило, они состоят из одной цифры, то есть вы можете отключить все такие прерывания одной строкой кода:источник
Возможно, я только что получил способ уничтожить javascript. Используя getElementsByName в моей функции javascript, я установил петлю между обработчиком кадров и реальным сценарием уничтожения кадров. проверить этот пост. http://www.phcityonweb.com/frame-buster-buster-buster-2426
источник
setInterval и setTimeout создают автоматически увеличивающийся интервал. Каждый раз, когда вызывается setTimeout или setInterval, это число увеличивается на единицу, поэтому, если вы вызовете setTimeout, вы получите текущее максимальное значение.
Поскольку почти 10000 одновременных операций setIntervals и setTimeouts работают почти всегда, а setTimeout возвращает «последний созданный интервал или время ожидания + 1», а поскольку top.clearInterval по-прежнему доступен, это отразит атаки черной шляпы на кадр. сайты, которые описаны выше.
источник
Используйте htaccess, чтобы избежать большого набора кадров, iframe и любого контента, например изображений.
Это покажет страницу авторских прав вместо ожидаемого.
источник
<meta name="referrer" …/>
и б) также устанавливается при переходе по ссылкам, поэтому вы также запрещаете ссылки на свою страницу и прерываете паутина.