Как определить, была ли страница загружена в iframe или на другом домене (и что с этим делать)
03.04.2021
В практике работы с сайтами я сталкивался с самыми разными случаями воровства у меня контента. Среди них можно выделить такие как:
- полное проксирование сайта на чужом домене
- вставка в iframe
С обоими этими ситуациями можно бороться.
Как запретить показ своего сайта на чужом домене
Рассмотрим вариант когда сайт проксируется. Имеется ввиду не ситуация, когда кто-то скачал страницы сайта программой вроде HTTrack и затем выложил его копию на другой домен. А имеется ввиду случаи, когда ПО вроде прокси делает запрос на ваш сайт и подменяет все внутренние ссылки на адреса на своём домене. Получается полное зеркало, которое обновляется одновременно вместе с оригинальным сайтом.
Я не знаю, для чего это делают (такое произошло с одним из моих сайтов), но я покажу, как с этим бороться.
Поскольку сайт копировался полностью, вместе со всеми скриптами, то достаточно добавить подобный код:
<script> if (/(www\.)?mysite\.com/.test(window.location.hostname)) { } else { window.location = 'https://mysite.com'; } </script>
Этот код проверяет, на каком домене открыта страница, и если эта страница не на домене mysite.com, то делается редирект на https://mysite.com.
Проблема в том, что при проксировании все упоминания mysite.com заменяются на ЧУЖОЙ_ДОМЕН.ru, в результате код превращался в:
<script> if (/(www\.)?mysite\.com/.test(window.location.hostname)) { } else { window.location = 'https://ЧУЖОЙ_ДОМЕН.ru'; } </script>
Код можно обфусцировать (но недостаточно просто минимизировать!). Но ещё проще спрятать строку «mysite.com» с помощью функций btoa и atob.
Функции btoa и atob являются встроенными функциями JavaScript и всегда доступны.
Функция btoa переводит указанную строку в набор символов (работает наподобие Base64), а функция atob выполняет обратную операцию.
Принцип действия в двух строках:
btoa('Some text'); // U29tZSB0ZXh0 atob('U29tZSB0ZXh0'); // Some text
Итак, посмотрим, во что превратится строка «https://mysite.com»:
<script> document.write(btoa('https://mysite.com')); </script>
Результат:
aHR0cHM6Ly9teXNpdGUuY29t
Теперь в моём простом коде делаем с помощью функции atob обратное преобразование этой строки, получаем:
if (/(www\.)?mysite\.com/.test(window.location.hostname)) { } else { window.location = atob('aHR0cHM6Ly9teXNpdGUuY29t'); }
Данные код делает именно то, что нужно — проверяет на каком домене сайт был открыт и в случае если это не mysite.com, то делает редирект на mysite.com. При этом при проксировании сайта, парсеры не видят строку mysite.com и не делают никаких изменений в этом фрагменте кода.
Этот код можно вставить, например, в шапку страницы.
Как бороться со вставкой страниц в iframe
На самом деле, лучше не бороться со вставкой в iframe, поскольку у iframe множество полезных применений, например, в translate.google.com при переводе страниц сайта используется iframe, в Яндекс.Толоке и прочее.
Но иногда действительно необходимо запретить вставлять сайт в iframe, например, в случае атак на сайт связанных с накруткой и другими опасными действиями.
Следующий фрагмент кода проверяет, открыта ли страница в iframe, и если да, то делает перенаправление на https://mysite.com.
<script> function inIframe () { try { return window.self !== window.top; } catch (e) { return true; } } if(inIframe ()) { window.top.location.href = "https://mysite.com"; } </script>
Этот код прекрасно работает в Firefox, но Chrome блокирует автоматические редиректы, поэтому в Chrome только появляется предложение следовать перенаправлению.
Следующий фрагмент полностью очищает страницу, если обнаруживает, что она была открыта в iframe.
<script> function inIframe () { try { return window.self !== window.top; } catch (e) { return true; } } if(inIframe ()) { while (document.firstChild) { document.removeChild(document.firstChild); } } </script>
Повторюсь — не стоит злоупотреблять запретом iframe.
Билеты на автобусы, паромы и поезда, в том числе стыковочные маршруты:
Авиабилеты на международные и местные направления по минимальным ценам:
Связанные статьи:
- Не работает перенаправление на HTTPS в WordPress (100%)
- Как поменять адрес страницы при изменении её названия в WordPress (91.2%)
- Как сбросить пароль WordPress без доступа к почте (60.1%)
- Безопасность сайтов на WordPress (60.1%)
- Как настроить автоматическое резервное копирование сайта WordPress с выгрузкой в облако (БЕСПЛАТНО) (60.1%)
- Какую информацию собирает Google — как просмотреть и удалить (RANDOM - 50%)