Как правильно защитить контент от копирования


Защита текста от копирования vs. XSS

Многие администраторы и вебмастера для защиты текста (контента) сайта от копирования используют различные JavaScript.

XSS в скриптах защиты контента от копирования

 

Но подавляющее большинство этих JS работает не совсем корректно.

Конечно же испытываешь не самые приятные ощущения, когда обнаруживаешь свой пост на каком-нибудь ГС, да еще и без обратной ссылки.

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

Конечно же такие действия не смогут защитить от копирования или просмотра исходного кода страницы, ведь все что можно увидеть — можно скопировать.

Как скопировать текст с защищенного сайта?

Да очень просто. Здесь даже не нужно ковыряться в исходном коде страницы удаляя ненужные теги, а достаточно проявить немного сообразительности сделать скриншот и пропустить его через ABBYY FineReader или любой другой программный аналог по распознаванию текста.

В целом, как вы понимаете, абсолютной защиты текста от копирования нет и просто быть не может.

Свою позицию по поводу защиты сайта от копирования, я уже когда-то высказывал, поэтому ограничусь одним предложением:

Если вы хотите защитить контент своего сайта от плагиата, то максимум что вам сможет в этом помочь программно — это простой JS, который будет добавлять к скопированному тексту ссылку на источник, не более того. 😉

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

Во время тестирования в JS была обнаружена XSS уязвимость, но переписывать пост я не стал, а решил написать новый.

Более того, я проверил работу подобных JS на нескольких сайтах, и все они содержат один и тот же баг.

Скорее всего это связано с тем, что вебмастера просто копируют друг у друга скрипты, в надежде на большой и чистый авось!

Reflected XSS in JavaScript

 

Причина данного бага кроется в отсутствии каких либо проверок в переменной после того, как в нее попадает скопированный текст.

Можете мне поверить на слово, а можете проверить, но большая часть JS которые направлены на защиту от копипаста подвержены данной уязвимости.

Как фиксить?

Есть несколько вариантов, поэтому приведу (самый простой) один из них.

Пишем простую функцию, которая заменит все опасные символы  <>&" на их HTML-сущности.

В PHP есть чем то похожая функция и называется она htmlspecialchars();

Вот ее (необходимый минимум) код:

function checkvar(variable)
{

variable = variable.replace(/&/g, "&amp;");
variable = variable.replace(/</g, "&lt;");
variable = variable.replace(/>/g, "&gt;");
variable = variable.replace(/"/g, "&quot;");
return variable;
}

Далее фильтруем нашу уязвимую переменную с помощью вышеописанной функции checkvar(copytext) и на выходе получаем корректный результат. 😀

Тысячи сайтов используют подобные JS для защиты своего контента от копирования, поэтому, как вы догадываетесь отправлять уведомления всем у меня просто нет возможности.

Но если вы читаете данный пост и реализуете на своем сайте защиту от копипаста с помощью JavaScript, то можете проверить насколько корректно она (защита) работает.

Для этого нужно:

1. Разместить на одной из страниц сайта следующий код:

<img src=1 onerror=alert(document.domain)>

javascript:alert(1)

после скопировать текст со страницы в буфер таким образом (у меня например нужно скопировать больше 300 символов) чтобы скрипт сработал.

Если код написан некорректно, то все теги из скопированного текста <h1><script><img> и т. д. попадают не в буфер обмена, а выполняются!

2. Также в некоторых скриптах к скопированному тексту добавляется ссылка на источник, которая берется из document.location.href, поэтому достаточно  добавить к урлу

site.com/page.html#<img src=1 onerror=alert(document.domain)>

или так:

site.com/page.html#<iframe src='javascript:alert(1);'>

и тоже скопировать нужное количество (символов) текста.

Конечно же на этом можно не ограничиваться, и написать настоящий аналог функции htmlspecialchars() на JavaScript. Тут уже, как говориться: на вкус и цвет..

Но а я в будущем планирую вообще отказаться от такой защиты контента, т. к. в блог пишу очень редко, поэтому собственно и воровать то нечего. 😉

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

Скачать JS можно здесь.