Blog. Just Blog

Защита контента сайта от копирования

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Сразу же оговорюсь, что я категорически против использования на практике любых методов, описываемых в этой статье. Любой запрет только раздражает посетителей сайта и вряд ли кто-то захочет вернуться снова на страницу, которая, например, блокирует правую кнопку мышки или требует для просмотра текста включенный JavaScript. Максимум, что я признаю, это пассивная защита контента. Это не говоря о том, что любую защиту в случае реальной необходимости можно без особых проблем обойти. Но тем не менее, активная защита от копирования контента иногда встречается на некоторых сайтах. В этой статье я собрал методы активной защиты, которые встречал на практике.

Первый способ, самый простой. Подавление событий выделения текста, движения и клика мышкой, копирования и вызова контекстного меню путем блокировки правой кнопки мыши. Ставится обработчик, который не дает событию всплывать по иерархии DOM и сразу же возвращает флажок отмены:
  1. function nocopy(event) {
  2.     var event event || window.event;
  3.     if (event.preventDefault) { event.preventDefault(); }
  4.     else { event.returnValue false; }
  5.     return false;
  6. }
  7.  
  8. document.onmousedown nocopy;
  9. document.onmouseup nocopy;
  10. document.onmousemove nocopy;
  11. document.ondragstart nocopy;
  12. document.onselectstart nocopy;
  13. document.ontextmenu nocopy;
  14. document.oncopy nocopy;
Способ кроссбраузерный, но, к счастью, прекрасно обходится через выделение всего текста клавишами Ctrl+A и последующего его копирования. В Firefox через настройки обходится защита от блокировки контекстного меню.

Следующий способ используется на онлайн-библиотеках, которые принадлежат копирастам и которые разрешают бесплатное чтение только через их сайт. Принцип действия этой защиты заключается в том, что каждые 10 миллисекунд проверяется наличие выделенного текста и, если таковой найден, принудительно устанавливается фокус на какой-нибудь другой элемент на странице, в данном случае это строка поиска. При этом выделение, естественно, теряется.
  1. Найти: <input type="text" id="searchbox" />
  1. function LockSel() {
  2.     selection '';
  3.     if (document.getSelection) {
  4.         selection document.getSelection();
  5.     }
  6.     else if (document.selection && document.selection.createRange()) {
  7.         selection document.selection.createRange().text;
  8.     }
  9.     var elem document.getElementById('searchbox');
  10.     if (elem != null && selection != '') {
  11.         elem.focus();
  12.     }
  13.     setTimeout ('LockSel()'10);
  14. }
  15. LockSel();
Способ хоть и примитивный, но достаточно эффективный. На сайтах онлайн-библиотек он дополнительно усиливается тем, что контент выводится также через JavaScript с использованием одноразовых токенов. Что, впрочем, ни капельки не мешает скачивать любые произведения при помощи несложных грабберов. Но это уже другая история.

Еще один интересный способ. В этом случае ставится обработчик на нажатия клавиш и блокируются комбинации Ctrl+A (выделение всего текста) и Ctrl+U (просмотр исходного текста страницы).
  1. // Вспомогательная функция установки обработчика события
  2. function addHandler(eventhandler){
  3.     if (document.attachEvent) {
  4.         document.attachEvent('on' eventhandler);
  5.     }
  6.     else if (document.addEventListener) {
  7.         document.addEventListener(eventhandlerfalse);
  8.     }
  9. }
  10.  
  11. // Вспомогательная функция принудительного снятия выделения
  12. function killSelection(){
  13.     if (window.getSelection) {
  14.         window.getSelection().removeAllRanges();
  15.     }
  16.     else if (document.selection && document.selection.clear) {
  17.       document.selection.clear();
  18.     }
  19. }
  20.  
  21. // Функция обработчика нажатия клавиш
  22. function noSelectionEvent(event) {
  23.     var event event || window.event;
  24.  
  25.     // При нажатии на Ctrl+A и Ctrl+U убрать выделение
  26.     // и подавить всплытие события
  27.     var key event.keyCode || event.which;
  28.     if (event.ctrlKey && (key == 65 || key == 85)) {
  29.         killSelection();
  30.         if (event.preventDefault) { event.preventDefault(); }
  31.         else { event.returnValue false; }
  32.         return false;
  33.     }
  34. }
  35.  
  36. // Установить обработчики клавиатуры
  37. addHandler('keydown'noSelectionEvent);
  38. addHandler('keyup'noSelectionEvent);
При работе с клавиатуры в некоторых браузерах действительно блокируется выделение текста и просмотр исходного кода. Но ведь главное меню браузера никто же не отменял? В Firefox все прекрасно просматривается через "Вид" -> "Исходный код страницы" или аналогичные у других браузеров.

Следующий способ основан наоборот не на снятии выделения с текста, а на выделении по таймеру какого-нибудь постороннего элемента. Например:
  1. <div id="protect" name="protect" style="display:none;">Copyright Protected!</div>
  1. // Вспомогательная функция выделения текста
  2. function protectHTML() {
  3.     var el=document.getElementById('protect');
  4.  
  5.     if (document.body.createTextRange) {
  6.         var tmp=document.body.createTextRange();
  7.         tmp.moveToElementText(el);
  8.         tmp.select();
  9.     }
  10.     else if (window.getSelection) {
  11.         var tmp=window.getSelection();
  12.         if (tmp !== null) {
  13.             if (tmp.setBaseAndExtent) {
  14.                 var child=el.lastChild;
  15.                 tmp.setBaseAndExtent(el0child,
  16.                     typeof(child.innerText) == 'undefined' ?
  17.                     child.textContent.length child.innerText.length);
  18.             }
  19.             else {
  20.                 var range=document.createRange();
  21.                 range.selectNodeContents(el);
  22.                 tmp.removeAllRanges();
  23.                 tmp.addRange(range);
  24.             }
  25.         }
  26.     }
  27. }
  28. // Запустить функцию по таймеру
  29. setInterval('protectHTML()',10);
Следующий способ, на мой взгляд, наиболее адекватный, так как он не ограничивает пользователя в выделении и копировании текста. Но при копировании к выделенному тексту в конец добавляется строка с указанием копирайта и первоисточника. Кроссбраузерность можно доделать на основе предыдущего кода.
  1. function addLink() {
  2.     var body_element document.getElementsByTagName('body')[0];
  3.     var selection window.getSelection();
  4.     var pagelink '<br /><br /> Источник: '+
  5.         '<a href="'+document.location.href+'">'+document.location.href+'</a>';
  6.     var copytext selection pagelink;
  7.  
  8.     // Создать новый элемент за пределами экрана
  9.     var newdiv document.createElement('div');
  10.     newdiv.style.position='absolute';
  11.     newdiv.style.left='-99999px';
  12.     body_element.appendChild(newdiv);
  13.  
  14.     // Выделить созданный элемент
  15.     newdiv.innerHTML copytext;
  16.     selection.selectAllChildren(newdiv);
  17.  
  18.     // Удалить созданный элемент
  19.     window.setTimeout(function() {
  20.         body_element.removeChild(newdiv);
  21.     },0);
  22. }
  23.  
  24. document.oncopy addLink;
И напоследок небольшой трюк, который используется для защиты картинок от сохранения. Его принцип заключается в том, что вместо картинки выводится прозрачный GIF-файл, растянутый под размер оригинальной картинки, а сама картинка выводится как фоновое изображение. В результате при попытке сохранить изображение вместо него сохраняется только картинка-пустышка. Например:
  1. <img src="nocopy.gif" style="background:url('original_image.jpg');"
  2. width="500" height="400" />
Специально для таких хитросделанных сайтостроителей придумали расширение Firefox Backgroundimage Saver, которое позволяет сохранять фоновые изображения.

К пассивным защитам от копирования можно отнести использование особого правила CSS, которое не дает выделить определенный участок текста. Невозможно выделить - невозможно скопировать (ну почти :)).
  1. <style type="text/css">
  2. .not_for_copy {
  3.     -webkit-touch-calloutnone;
  4.     -webkit-user-selectnone;
  5.     -khtml-user-selectnone;
  6.     -moz-user-selectnone;
  7.     -ms-user-selectnone;
  8.     -o-user-selectnone;
  9.     user-selectnone;
  10. }
  11. </style>
  12.  
  13. <div class="not_for_copy">Этот текст выделить нельзя!</div>
Вот тестовая страничка, использующая некоторые из описанных в статье методов защиты текста от копирования. Но повторюсь, что использование подобной защиты на реальных сайтах пойдет им только во вред. Единственный способ защититься от копирования контента - НИЧЕГО НЕ ВЫКЛАДЫВАТЬ В ИНТЕРНЕТ. Все остальное гарантированно будет иметь обратный эффект.

Поделиться ссылкой ВКонтакте
Просмотров: 23372 | Комментариев: 27

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Никто (21.04.2021 в 15:53):
Скриншот области экрана хорошего монитора - это хорошая картинка.
Скрин с распознаванием в ABBYY Screenshot - это уже всё, даже переводчик.
Длительно, но гарантированно.
X (18.02.2016 в 02:52):
На 2016.2 для андроида 4.4. Все это не работает-опера,янд,хром mozz- единственное сохр.страницу в pdf,а затем через приложение(отдельное) -распознавание текста- копирование и верстка в единый документ(любое отдел.приложение)Народ какие идеи?не знаю можно ли давать ссылку на конки.сайт?вдруг решат,что реклама?А тема интересная!

Опечатка в тексте -конкретный сайт
Андрей (19.09.2014 в 12:38):
просто FireBug и всё...)))
Марина (18.06.2013 в 01:45):
Как она достала эта школота uCoz-ловская, вместе с их техподдержкой, "дайте нотариально заверенную копию интеллектуальной собственности документа" - вся их отговорка, закрыть бы их лавку навсегда. Или лучше браузерным разрабам руки оттяпать до ягодиц, чтобы закрыли возможность просмотра скрытого кода страницы - вот где сидит исток возможности паразитизма.

Админ и комментирующие, большое спасибо за методы, борьбы, потружусь пристроить.
ManHunter (15.01.2013 в 09:59):
Firefox - выделить текст - правый мыш - копировать.
VIP (15.01.2013 в 01:53):
[удалено] - как скопировать этот текст?
User (13.10.2012 в 15:56):
В Опера не хотела сохранять. Странно.
ManHunter (11.10.2012 в 22:50):
Firefox - правый мыш - сохранить. На выходе имеем нормальную PNG. Не знаю что там у кого не сохраняется.
user (11.10.2012 в 22:32):
http://hivemind.me/thread/1283
Вот есть тут пикча: http://pic.hivemind.me/full/8906, например.
При попытке сохранить сохраняет просто черное изображение.
ManHunter (30.07.2012 в 14:41):
Firefox + Firebug легко решают проблему.
PressAnyKey (30.07.2012 в 14:30):
Спасибо за содержательную статью и приведенные примеры.
Весьма познавательно. (В особенности в совокупности с более раней статьей "Защита контента сайта при помощи CSS")
Хорошо бы дополнить материал примерами скриптов реализующих шифрование исходного кода и его последующий вывод при помощи Java Script. (Тоже ведь какая-никакая защита.)
Заинтересовавшись этой темой нашел некоторые коммерческие продукты, которые "типа" реализуют защиту контента подобными средствами (не стесняясь брать за это денежку) Но не суть... Если не сложно взгляните на демо-страницу одного из таких продуктов. (не сочтите за рекламу) htmlguard.com/sample.html После загрузки страницы первым делом отключаю Javascript и CSS до кучи, но тем не менее, при попытке копирования, текст в буфер не попадает. Как это реализовано?
ManHunter (11.07.2012 в 11:08):
Можно
Мимоход (11.07.2012 в 03:45):
ManHunter, спасибо за информацию. Я сделал простенькое правило для проксомитрона, чтобы вырезал строчки

document.onmousedown = nocopy;
document.onmouseup = nocopy;
document.onmousemove = nocopy;
document.ondragstart = nocopy;
document.onselectstart = nocopy;
document.ontextmenu = nocopy;
document.oncopy = nocopy;

и теперь могу копировать на тестовой странице. Вопрос: можно ли как-то шифровать эти строки, чтобы их нельзя было так просто вырезать?

Вместо звезд строки с 8 по 14 из первого примера. Сори.
Вадим (10.07.2012 в 22:58):
Не знаю специально или нет, однажды коллега столкнулся при копипасте. Суть в том что скопированный с сайте текст передавался "белым" и мелким размером шрифта, в результате при вставке в word было ничего не видно, как будто текста нет. Минут на 10 я был в ступоре, отключал скрипты и т.п.
ManHunter (07.07.2012 в 11:01):
SVS, твой метод - модификация метода с добавлением ссылки к копируемому фрагменту. С тем же успехом можно копировать не текст и не мусор, а какую-нибудь строку типа "Защищено дурацким копирайтом".
SVS (07.07.2012 в 00:48):
ManHunter, нет у тя тут в копилке сторонних дуростей вот такой метод: когда при копировании или сохранении на выходе получается абракадабра (причём это вовсе не кодировка, а именно срабатывание скрипта на вставку в текст всякого мусора - это онлайн-библиотеки некоторые так свой контент защищают + защита от печати страницы ещё. Эти методы хорошо обходятся банальным и всеядным evernote c https://evernote.com/
Насчёт тест-картинки :) файрфоксом, без сомнения, в один клик и особых телодвижений, а вот тестю хром на пару, так вот в хроме такие телодвижения были: Правый клик - Просмотр кода элемента - в выделенной строке "<img src="nocopy.gif" style="background:url('programmers.jpg');"  справа в окне формы Styles будет достаточно через контекстное меню правым кликом мыша по ссылке в строчке element.element.style {background: url('programmers.jpg');} либо Сохранить картинку, либо Открыть картинку в новой вкладке.
Второй способ (найти прямой адрес картинки в коде): искомая строчка найдена как -
<img style="-webkit-user-select: none; cursor: -webkit-zoom-out; " src="http://www.manhunter.ru/demo/programmers.jpg" width="526" height="462">
Pegas-x (06.07.2012 в 17:31):
Согласен на все 100% ...

Но чисто теоретические выкладки почитал с удовольствием, поскольку сам программист и подобные головоломки решать одно удовольствие!
ManHunter (06.07.2012 в 17:30):
Чаще ее ставят по команде начальника или по заказу клиента "и сделай так, шоб с моего чудо-сайта ничо не спиздили". Никто в здравом уме и по доброй воле не будет отпугивать посетителей сайта.
Pegas-x (06.07.2012 в 17:28):
> Конечно, а можно вообще отключить скрипты и все будет копироваться как надо. Но почему-то подобные извраты все еще встречаются на сайтах.

Я думаю что половина тех кто ставит такую защиту, наивно полагают что она работает, а половина надеется на безграмотность пользователей...
ManHunter (06.07.2012 в 17:17):
Конечно, а можно вообще отключить скрипты и все будет копироваться как надо. Но почему-то подобные извраты все еще встречаются на сайтах.
Pegas-x (06.07.2012 в 17:15):
Было занятно почитать, но скажу что против более-менее грамотного пользователя, это просто бессмысленно. К примеру расширение QuickJava для Mozilla Firefoxпозволяет обходить большинство защит JS нажав всего одну кнопку... При этом JS просто отключается, а загруженный скриптом контент остается :)
Балбес (05.07.2012 в 11:55):
Отнюдь. Далеко не все юзеры умеют разбирать код хтмл и смотреть, чего создатели наворотили
ManHunter (05.07.2012 в 11:48):
Против любой защиты есть меры противодействия. Поэтому я и говорю, что все эти защиты от копирования бесполезны.
Балбес (05.07.2012 в 11:47):
Последний пример особенно порадовал. И ведь по правому клику пункт "Показать фоновое изображение" не появляется. При это если хватаешь картинку и двигаешь, видишь, будто двигаешь фоновое изображение. Правда, против Print Screen'а нет приёма :).
Да и Nutscracker'а метод тоже хорош - он без яваскрипта.
ManHunter (05.07.2012 в 09:19):
Ellephant, действительно и его сюда можно подтянуть. Добавил.
Ellephant (05.07.2012 в 05:00):
ManHunter, А способ, где вставляется копирайт автора после копирования, почему не упомянул? ;)
Nutscracker (05.07.2012 в 01:22):
Еще бывает вот такая подлось:
* {
  -moz-user-select: none !important;
  ...
  user-select: none !important;
}
https://developer.mozilla.org/...-user-select

Тут поможет userContent.css в Firefox и прочие пользовательские стили.
И, говорят, помогает расширение RightToClick:
https://addons.mozilla.org/fir...ighttoclick/
http://nc.ddns.us/RightToClick...tToClick.htm

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 2 (0.0079 сек.) / Память: 4.5 Mb
Наверх