Loading...
X

Как определить, была ли страница загружена в iframe или на другом домене (и что с этим делать)

В практике работы с сайтами я сталкивался с самыми разными случаями воровства у меня контента. Среди них можно выделить такие как:

  • полное проксирование сайта на чужом домене
  • вставка в 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.

Рекомендуется вам:


Leave Your Observation

Ваш адрес email не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo

Бесплатная карта с кэшбэком 1,5% и до 5% на остаток (Альфа-Карта) + бонус 500 рублей за первую покупку

Кредитная карта только по паспорту! Бесплатное снятие наличных

Scroll Up