Як запобігти завантаженню сторінки мого сайту через незалежний фрейм сайту iFrame


81

Як я можу дізнатися, що моя сторінка вбудована як кадр на інший сайт під час завантаження сторінки? Я думаю, заголовок запиту реферала не може мені тут допомогти? Дякую.


Привіт, Джон, я не можу сказати, що мені тут потрібне повне рішення, достатньо просто рухатися в напрямку, після того, як я знайду відповідь на своє запитання, я завжди публікую це як відповідь, це єдиний спосіб я можу взяти участь у спільноті.
абовесун

Примітка: Встановлення метатегу марно! Наприклад, <meta http-equiv = "X-Frame-Options" content = "deny"> не впливає. Не використовуйте його! Тільки встановивши заголовок HTTP, як у прикладах нижче, X-Frame-Options буде працювати. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Хосам Ельзаг

Відповіді:


102

Ви не можете перевірити це з боку сервера, але ви можете використовувати javascript для його виявлення після завантаження сторінки. Порівняйте topі self, якщо вони не однакові, ви потрапляєте в кадр.

Крім того, деякі сучасні браузери поважають X-FRAME-OPTIONSзаголовок, який може мати два значення:

  • DENY - запобігає відображенню сторінки, якщо вона міститься у фреймі
  • SAMEORIGIN - те саме, що і вище, якщо тільки сторінка не належить до того самого домену, що і власник набору кадрів верхнього рівня.

Користувачі включають Picasa від Google, яку неможливо вставити у фрейм.

Браузери, які підтримують заголовок, з мінімальною версією:

  • IE8 та IE9
  • Opera 10.50
  • Сафарі 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (старіші версії з NoScript )

2
Оскільки я натрапив сюди за допомогою пошуку в Google, я додам, що Firefox додав X-FRAME-OPTIONS у серпні 2010 року з FF3.6.9: michael-coates.blogspot.com/2010/08/…
ThePants


44

Stackoverflow включає деякі JS для тестування ( master.js). Це відповідна його частина:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Але майте на увазі, що JS можна відключити.


Цей підхід особливо корисний, якщо ви хочете отримати повідомлення або особі, яка розміщує ваш вміст у iframe, або кінцевому користувачеві їх веб-сайту, який переглядає ваш вміст у iframe.
kevinmicke

30

Для сучасних браузерів ви можете використовувати CSP (Політика безпеки вмісту), яка є стандартом. Наступний заголовок не дозволить документу завантажуватися у фрейм де завгодно:

Content-Security-Policy: frame-ancestors 'none'

( X-Однак IE 11 потребує префікса). Ви також можете змінити 'none'джерело, для якого дозволено обрамлення, наприклад, власний сайт.

Щоб охопити старіші браузери, це найкраще використовувати разом із відповіддю @ Maerlyn .


1
Ваша відповідь недостатньо чітка з усією повагою. Це код заголовка чи PHP? Наприклад.
Gary Carlyle Cook

2
@GaryCarlyleCook Це заголовок HTTP, який повинен бути частиною відповіді браузера при обслуговуванні сторінки. Це не PHP-код, хоча ви можете використовувати PHP для його надсилання; див. header ()
rvighne

15

ви можете запобігти завантаженню вашої сторінки в iframe за допомогою javascript

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

цей код змінює адресу контейнера iframe вашої сторінки на адресу вашої сторінки та примушує контейнер відображати вашу сторінку.


1
sandboxатрибут на iframe дозволяє заборонити подібні кадри, що уникають хаків. Отже, цей спосіб не є захищеним способом запобігти обрамленню, якщо ваша проблема стосується питань безпеки.
Фредерік

6

Або ви можете заблокувати певний домен, якщо ви не заперечуєте проти вашого вмісту в деяких місцях, але не хочете його на певному сайті. Наприклад, якщо ви offendingdomain.comвбудовували ваш вміст, ви можете зробити це:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Це дозволить перевірити місцезнаходження батьківського документа та перевірити, чи саме він offendingdomain.comвбудовує ваш вміст. Потім цей сценарій надсилає цей iframe до певного відомого відео YouTube для покарання. Фактично вони просто самі себе Рік-Ролл.


3

Використовуйте javascript, щоб перевірити, чи завантажено його у iframe, розмістивши наступний скрипт у кінці вашого php-файлу та переспрямувавши на сторінку, на якій відображається попередження або повідомлення про те, що вашу сторінку не слід завантажувати за допомогою iframe.

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.