Скрипт защиты контента при копировании: как он работает и зачем нужен

Этот скрипт устраняет само желание копировать контент с вашего сайта. При копировании и вставке (копи-пастинг) текст будет дополнен контентом, который сложно очистить средствами "найти и заменить".

Рейтинг на основе отзывов:
Звезд получено: 10
Oтзывов всего: 2
Средняя оценка: 5
Комментариев на странице: 4
Опубликовано в: Блог пользователей

Скрипт защиты контента при копировании: как он работает и зачем нужен

Владельцы сайтов, блогов и лендингов регулярно сталкиваются с одной и той же проблемой — контент копируют. Причём не просто копируют, а уносят без указания источника, без ссылок и без какого-либо упоминания автора.

Один из практичных способов частично решить эту проблему — перехват события копирования (copy) в браузере и модификация содержимого буфера обмена. Рассмотрим реальный скрипт, который делает это на продвинутом уровне.

Этот скрипт устраняет само желание копировать контент с вашего сайта. При копировании и вставке (копи-пастинг) текст будет дополнен контентом, который сложно очистить средствами "найти и заменить". 


Что делает этот скрипт

Скрипт перехватывает стандартное поведение копирования и:

  1. Изменяет HTML-контент перед попаданием в буфер обмена
  2. Добавляет ссылку на источник
  3. Маскирует ссылку в исходном коде
  4. Вставляет «шум» в текст
  5. Добавляет скрытые маркеры

В результате пользователь вроде бы копирует текст, но получает модифицированную версию.


Ключевые задачи, которые решает скрипт

1. Принудительное добавление ссылки на источник

При любом копировании в конец вставляется блок:

  Источник копирования: [ссылка]  

Это решает сразу две задачи:

  • увеличивает шанс сохранения ссылки при вставке
  • формирует обратные упоминания (пусть и не всегда SEO-ценные)

2. Обфускация (скрытие) ссылки в коде

В коде нет прямой строки вида:

  https://example.com  

Вместо этого используется разбиение:

  constURL_PARTS= ['ht','tps','://','site.','com','/'];  

А затем сборка:

  URL_PARTS.join('')  

Зачем это нужно:

  • усложняет парсинг кода ботами
  • скрывает ссылку от быстрого поиска по исходникам
  • снижает вероятность автоматического извлечения URL

3. Перехват события copy

Ключевой механизм:

  document.addEventListener("copy", function (e) {  

Скрипт:

  • получает выделенный пользователем контент
  • клонирует его
  • модифицирует
  • вручную записывает в буфер обмена через:
  e.clipboardData.setData(...)
e.preventDefault()  

Это позволяет полностью контролировать результат копирования.


4. Добавление «шума» в текст

Скрипт вставляет случайные числовые последовательности:

  [1234] текст {56789}  

И даже внутрь слов:

  word[123]  

Цель:

  • ухудшить читаемость скопированного текста
  • сделать массовое копирование менее привлекательным
  • создать дополнительный «мусор» для парсеров

5. Zero-width маркеры (невидимые символы)

Используются Unicode-символы:

  • \u200B (zero-width space)
  • \u200C

Они кодируют строку вроде:

  SRC:domain|url  

И внедряются в текст.

Зачем это нужно:

  • скрытая маркировка источника
  • возможность отслеживания утечек контента
  • незаметность для пользователя

6. Модификация plain-text версии

Важно, что скрипт обрабатывает не только HTML, но и обычный текст:

  e.clipboardData.setData("text/plain", plainText);  

Туда добавляется:

  • шум
  • ссылка
  • ID
  • домен источника

Это гарантирует, что даже при вставке в блокнот или мессенджер защита сохраняется.


7. Генерация уникальных идентификаторов

Каждое копирование получает уникальный ID:

  randomString() +"-"+randomNumbers()  

Это может использоваться для:

  • отслеживания копий
  • аналитики
  • выявления источников утечки

8. Анти-парсинг на странице

После загрузки страницы скрипт добавляет скрытые элементы:

  <spanstyle="display:none">J123456...</span>  

Это:

  • засоряет DOM
  • мешает простым парсерам
  • усложняет извлечение «чистого» текста

Насколько это эффективно

Важно понимать: это не защита в криптографическом смысле.

Опытный пользователь или разработчик:

  • сможет отключить JS
  • извлечь текст через DevTools
  • обойти перехват copy

Однако скрипт отлично работает против:

  • ленивого копипаста
  • массового воровства контента
  • примитивных ботов и парсеров

Плюсы подхода

 - Простая интеграция
 - Работает во всех современных браузерах
 - Не требует сервера
 - Усложняет автоматический парсинг
 - Добавляет источник при копировании


Минусы

 - Можно обойти
 - Может раздражать пользователей
 - Добавляет «мусор» в буфер обмена
 - Не даёт 100% защиты


Когда стоит использовать

Скрипт особенно полезен для:

  • SEO-статей
  • лендингов
  • описаний товаров
  • информационных сайтов
  • блогов с уникальным контентом

Итог

Этот скрипт — не про «запретить копирование», а про повышение цены копирования.

Он:

  • добавляет friction (трение)
  • снижает удобство воровства
  • увеличивает шанс сохранения источника

И в реальных условиях этого часто достаточно, чтобы отсечь большую часть нежелательных копий.

и на последок сам скрипт

 

			<div class="card mb-4 border-0">
				<div class="card-body message-body">  
					<div class="mb-3">
						{MARKET_TEXT}
					</div>
				</div>	
			</div>

 

<script>
(function(){

    // ===== НАСТРОЙКИ =====
    const TARGET_SELECTOR = '.message-body .mb-3';

    // ===== УТИЛИТЫ =====
    function randomString(len = 8) {
        return Math.random().toString(36).substring(2, 2 + len);
    }

    function randomNumbers(len = 6) {
        let out = '';
        for (let i = 0; i < len; i++) {
            out += Math.floor(Math.random() * 10);
        }
        return out;
    }

    function encodeZeroWidth(str) {
        let binary = '';
        for (let i = 0; i < str.length; i++) {
            binary += str.charCodeAt(i).toString(2).padStart(8, '0');
        }
        return binary.replace(/0/g, '\u200B').replace(/1/g, '\u200C');
    }

    function injectHidden(text, mark) {
        let mid = Math.floor(text.length / 2);
        return text.slice(0, mid) + mark + text.slice(mid);
    }

    function insertRandomNumbersInside(text) {
        return text.split(' ').map(word => {
            const rnd = `[${randomNumbers(3)}]`;
            return word + rnd;
        }).join(' ');
    }

    function wrapWithRandomNumbers(text) {
        const left = `[${randomNumbers(4)}]`;
        const right = `{${randomNumbers(5)}}`;
        const inside = insertRandomNumbersInside(text);
        return left + inside + right;
    }

    // ===== РАЗБИТЫЕ ЧАСТИ (НЕТ ЦЕЛОЙ ССЫЛКИ) =====
    const URL_PARTS = ['ht','tps','://','rt.','porn','hub','.com','/'];

    const TEXT_PARTS = [
        "You're too tense! ",
        "<strong>",
        "Jerk off and go Google!",
        "</strong>"
    ];

    function buildUrl(){
        return URL_PARTS.join('');
    }

    function buildText(){
        return TEXT_PARTS.join('');
    }

	// ===== COPY ПЕРЕХВАТ =====
	document.addEventListener("copy", function (e) {

		const selection = window.getSelection();
		if (!selection || selection.rangeCount === 0) return;

		const hiddenMark = encodeZeroWidth("SRC:" + window.location.hostname + "|" + window.location.href);

		const container = document.createElement("div");
		for (let i = 0; i < selection.rangeCount; i++) {
			container.appendChild(selection.getRangeAt(i).cloneContents());
		}

		let html = container.innerHTML;

		// Оборачиваем текст
		html = html.replace(/(<p[^>]*>)([\s\S]*?)(<\/p>)/gi, function(match, open, content, close){
			return open + wrapWithRandomNumbers(content) + close;
		});

		html = html.replace(/(<li[^>]*>)([\s\S]*?)(<\/li>)/gi, function(match, open, content, close){
			return open + wrapWithRandomNumbers(content) + close;
		});

		// ===== ВСТАВКА ССЫЛКИ =====
		html = html.replace(/<\/(p|li|h1|h2|h3)>/gi, function(match){

			const uid = randomString(10) + "-" + randomNumbers(10);
			const noisyText = wrapWithRandomNumbers('Источник копирования описания:');

            const url = buildUrl();
            const text = buildText();

			const block = `
	<span data-copy="true" style="font-size:18px;color:#ff5100!important;">
	${noisyText} <a href="${url}">${text}</a>
	<span style="display:none;">ID:${uid}</span>
	</span>
	`;
			return match + block;
		});

		// ===== TEXT VERSION =====
		let textContent = selection.toString();
		textContent = injectHidden(textContent, hiddenMark);

		function addNoise(text) {
			return text.replace(/([.,:aAоО])/g, function(match){
				return match + `[${randomNumbers(4)}]{${randomNumbers(5)}}`;
			});
		}

		const textWithNoise = addNoise(textContent);

		const uidPlain = randomString(10) + "-" + randomNumbers(10);

        const url = buildUrl();

		const plainText =
			textWithNoise +
			"\n\nИсточник: You better go masturbate, you are too tense" +
			"\n" + url +
			"\nID:" + uidPlain +
			"\n[" + window.location.hostname + "]";

		e.clipboardData.setData("text/html", html);
		e.clipboardData.setData("text/plain", plainText);

		e.preventDefault();
	});

    // ===== АНТИ-ПАРСЕР =====
    document.addEventListener("DOMContentLoaded", function () {

        const container = document.querySelector(TARGET_SELECTOR);
        if (!container) return;

        const blocks = container.querySelectorAll('p, li');

        blocks.forEach(el => {
            const junk = document.createElement("span");
            junk.style.display = "none";
            junk.textContent = "J" + randomNumbers(12);
            el.appendChild(junk);
        });

    });

})();
</script>

 

Отзывы 2

Мы ржали "всем селом"

Давно не заходил к вам. появилась минутку, посмотреть что нового. Подключил скрипт так ради интереса. Ржал сам, долго. Затем показал брату. Ржали вместе. Показали "однокашникам" - ржали всем селом. Результат "ну аут"....... поставил этот скрипт - никакая защита от копирования уже не нужна. это вынос мозга в нокаут и безапелляционно. Спасибо за приятные эмоции. Смеялись долго! Класс!

21.03.2026 22:56

Жесть!

Почитала отзыв Квентина. думаю попробую, что там такого смешного? ... Поставила. Смеялась. Пыталась как-то "обойти".. и плакала и смеялась. это ж надо такое придумать )))

22.03.2026 19:32


Комментарии (4)

webitproff

4. Carbonate Sodium

24.03.2026 13:50

так в том и смысл, что бы создать дополнительные "телодвижения" и "заморочки"... никогда никто не даст 100 процентов защиты. этот скрипт для ленивых и чисто "по-ржать". 

но есть варианты отключить саму возможность выделять и копировать текст, но ИИ по ссылке всё равно вытянет текст. зато с картинками у него реальные проблемы ))) 

Как итог: 100% защиты нет, а усложнить и вынести мозг - это можно 🙃

losdriver

3. losdriver

24.03.2026 10:58

Поставил скрипт. вставил скопированный текст в ГПТ - распознает легко! В чем смысл?

webitproff

2. Carbonate Sodium

22.03.2026 11:35

Эх молодежь... смотрите третью страницу, пример реализации с инструкцией, будет работать на любом движке сайта или без движка вообще. Перед закрывающим тегом </body> он может быть в футере вставляем скрипт как есть. а затем в нужный блок тела страницы, там где ваши тексты, просто добавляем ID  id="protected-block" который будет отслеживать скрипт. и всё  

villafitta

1. villafitta

22.03.2026 11:25

Здравствуйте. а этот скрипт работает только на Котонти? Не совсем поняла как его установить?

Добавление комментариев доступно только зарегистрированным пользователям

Похожие страницы

Защита контента от копирования. Инструкция и скрипт "DevTools-Block".
1 Комплексная защита веб-контента: обзор и анализ скрипта противодействия копированию и DevToolsВведениеКонтент — тексты,
SGE - Как работает поисковая генерация и почему генерация
2 Как работает поисковая генерация и почему генерация, дополненная поиском, - наше будущее Оцените уровень потенциальной
Фильтрация товаров. Как это работает?
3 Фильтрация товаров в интернет-магазине: как сделать удобный и эффективный каталог Фильтрация товаров — один из ключевых
Как работает меню категорий в модуле Market PRO v.5+
4 Меню категорий в модуле Market PRO v.5+ спроектировано как иерархическая, динамически управляемая структура, которая
Скрипт «Freelance MarketPlace» Это готовый сайт "под ключ"?
5 «Freelance MarketPlace» - это универсальный движок маркетплейса. Это готовый сайт "под ключ"? Это очень

Автор контента

webitproff

Оффлайн

Carbonate Sodium

Последняя авторизация: 08.06.2026 21:29

  • Чем могу помочь?

    Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.

  • Разработки на GitHub бесплатно
    • Страница размещена: 20.03.2026 23:49
    • Последнее обновление: 21.03.2026 19:33
    • Язык: