Защита контента сайта от копирования
Сразу же оговорюсь, что я категорически против использования на практике любых методов, описываемых в этой статье. Любой запрет только раздражает посетителей сайта и вряд ли кто-то захочет вернуться снова на страницу, которая, например, блокирует правую кнопку мышки или требует для просмотра текста включенный JavaScript. Максимум, что я признаю, это пассивная защита контента. Это не говоря о том, что любую защиту в случае реальной необходимости можно без особых проблем обойти. Но тем не менее, активная защита от копирования контента иногда встречается на некоторых сайтах. В этой статье я собрал методы активной защиты, которые встречал на практике.Первый способ, самый простой. Подавление событий выделения текста, движения и клика мышкой, копирования и вызова контекстного меню путем блокировки правой кнопки мыши. Ставится обработчик, который не дает событию всплывать по иерархии DOM и сразу же возвращает флажок отмены:
Code (JavaScript) : Убрать нумерацию
- function nocopy(event) {
- var event = event || window.event;
- if (event.preventDefault) { event.preventDefault(); }
- else { event.returnValue = false; }
- return false;
- }
- document.onmousedown = nocopy;
- document.onmouseup = nocopy;
- document.onmousemove = nocopy;
- document.ondragstart = nocopy;
- document.onselectstart = nocopy;
- document.ontextmenu = nocopy;
- document.oncopy = nocopy;
Следующий способ используется на онлайн-библиотеках, которые принадлежат копирастам и которые разрешают бесплатное чтение только через их сайт. Принцип действия этой защиты заключается в том, что каждые 10 миллисекунд проверяется наличие выделенного текста и, если таковой найден, принудительно устанавливается фокус на какой-нибудь другой элемент на странице, в данном случае это строка поиска. При этом выделение, естественно, теряется.
Code (HTML) : Убрать нумерацию
- Найти: <input type="text" id="searchbox" />
Code (JavaScript) : Убрать нумерацию
- function LockSel() {
- selection = '';
- if (document.getSelection) {
- selection = document.getSelection();
- }
- else if (document.selection && document.selection.createRange()) {
- selection = document.selection.createRange().text;
- }
- var elem = document.getElementById('searchbox');
- if (elem != null && selection != '') {
- elem.focus();
- }
- setTimeout ('LockSel()', 10);
- }
- LockSel();
Еще один интересный способ. В этом случае ставится обработчик на нажатия клавиш и блокируются комбинации Ctrl+A (выделение всего текста) и Ctrl+U (просмотр исходного текста страницы).
Code (JavaScript) : Убрать нумерацию
- // Вспомогательная функция установки обработчика события
- function addHandler(event, handler){
- if (document.attachEvent) {
- document.attachEvent('on' + event, handler);
- }
- else if (document.addEventListener) {
- document.addEventListener(event, handler, false);
- }
- }
- // Вспомогательная функция принудительного снятия выделения
- function killSelection(){
- if (window.getSelection) {
- window.getSelection().removeAllRanges();
- }
- else if (document.selection && document.selection.clear) {
- document.selection.clear();
- }
- }
- // Функция обработчика нажатия клавиш
- function noSelectionEvent(event) {
- var event = event || window.event;
- // При нажатии на Ctrl+A и Ctrl+U убрать выделение
- // и подавить всплытие события
- var key = event.keyCode || event.which;
- if (event.ctrlKey && (key == 65 || key == 85)) {
- killSelection();
- if (event.preventDefault) { event.preventDefault(); }
- else { event.returnValue = false; }
- return false;
- }
- }
- // Установить обработчики клавиатуры
- addHandler('keydown', noSelectionEvent);
- addHandler('keyup', noSelectionEvent);
Следующий способ основан наоборот не на снятии выделения с текста, а на выделении по таймеру какого-нибудь постороннего элемента. Например:
Code (HTML) : Убрать нумерацию
- <div id="protect" name="protect" style="display:none;">Copyright Protected!</div>
Code (JavaScript) : Убрать нумерацию
- // Вспомогательная функция выделения текста
- function protectHTML() {
- var el=document.getElementById('protect');
- if (document.body.createTextRange) {
- var tmp=document.body.createTextRange();
- tmp.moveToElementText(el);
- tmp.select();
- }
- else if (window.getSelection) {
- var tmp=window.getSelection();
- if (tmp !== null) {
- if (tmp.setBaseAndExtent) {
- var child=el.lastChild;
- tmp.setBaseAndExtent(el, 0, child,
- typeof(child.innerText) == 'undefined' ?
- child.textContent.length : child.innerText.length);
- }
- else {
- var range=document.createRange();
- range.selectNodeContents(el);
- tmp.removeAllRanges();
- tmp.addRange(range);
- }
- }
- }
- }
- // Запустить функцию по таймеру
- setInterval('protectHTML()',10);
Code (JavaScript) : Убрать нумерацию
- function addLink() {
- var body_element = document.getElementsByTagName('body')[0];
- var selection = window.getSelection();
- var pagelink = '<br /><br /> Источник: '+
- '<a href="'+document.location.href+'">'+document.location.href+'</a>';
- var copytext = selection + pagelink;
- // Создать новый элемент за пределами экрана
- var newdiv = document.createElement('div');
- newdiv.style.position='absolute';
- newdiv.style.left='-99999px';
- body_element.appendChild(newdiv);
- // Выделить созданный элемент
- newdiv.innerHTML = copytext;
- selection.selectAllChildren(newdiv);
- // Удалить созданный элемент
- window.setTimeout(function() {
- body_element.removeChild(newdiv);
- },0);
- }
- document.oncopy = addLink;
Code (HTML) : Убрать нумерацию
- <img src="nocopy.gif" style="background:url('original_image.jpg');"
- width="500" height="400" />
К пассивным защитам от копирования можно отнести использование особого правила CSS, которое не дает выделить определенный участок текста. Невозможно выделить - невозможно скопировать (ну почти :)).
Code (HTML) : Убрать нумерацию
- <style type="text/css">
- .not_for_copy {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -o-user-select: none;
- user-select: none;
- }
- </style>
- <div class="not_for_copy">Этот текст выделить нельзя!</div>
Просмотров: 23513 | Комментариев: 27
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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, например.
При попытке сохранить сохраняет просто черное изображение.
Вот есть тут пикча: 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 до кучи, но тем не менее, при попытке копирования, текст в буфер не попадает. Как это реализовано?
Весьма познавательно. (В особенности в совокупности с более раней статьей "Защита контента сайта при помощи 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 из первого примера. Сори.
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">
Насчёт тест-картинки :) файрфоксом, без сомнения, в один клик и особых телодвижений, а вот тестю хром на пару, так вот в хроме такие телодвижения были: Правый клик - Просмотр кода элемента - в выделенной строке "<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'а метод тоже хорош - он без яваскрипта.
Да и 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
* {
-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
Добавить комментарий
Заполните форму для добавления комментария
Скрин с распознаванием в ABBYY Screenshot - это уже всё, даже переводчик.
Длительно, но гарантированно.