На этой неделе столкнулся с необходимостью защитить контент на одном из сайтов от копирования. Ситуация заключалась в том, что на сайте есть закрытая часть, которая не видна поисковикам, здесь посетители оставляют свои заказы. Кто-то начал грабить парсером, либо копировать тексты заказов вручную и выкладывать их на своих говносайтах, использовать как контент для генерации доров и т.п. В общем, стал вопрос о том, как защитить тексты от копирования.
В случае с ручным копированием текстов были найдены следующие варианты защиты:
<script type="text/javascript"> function noselect() {return false;} // Отключаем возможность выделения текста по нажатию левой кнопки мыши. document.onmousedown = noselect; // Запрещаем контекстное меню, которое выпадает когда на странице щелкают правой кнопкой мыши. document.oncontextmenu = noselect; // Запрещаем копирование текста в буфер обмена. document.oncopy = noselect; // Вспомогательная функция установки обработчика события 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); </script> |
После добавления этого java-скрипта на страницу, пользователь не сможет вручную выделить и скопировать текст, а также просмотреть исходный код страницы по нажатию комбинации клавиш ctrl+U.
От парсеров данный вид защиты не спасёт, кроме того можно открыть исходный код страницы через меню браузера и скопировать текст оттуда. Чтобы этого избежать придется использовать шифрование кода. Существует огромное количество способов шифровки текста, один из которых я решил рассмотреть более детально.
Шифрование кода на PHP
1 2 3 4 5 6 7 8 9 | <?php $a = file_get_contents('file.txt'); $a = str_split($a); $e = ''; foreach ($a as $v) { $e .= '%' . $v[0] . (ord($v[0])+ord($v[1])); } ?> |
где:
функция file_get_contents — получаем содержимое файла в виде одной строки;
функция str_split — преобразуем строку в массив;
функция ord — получаем ASCII код символа.
В целом механизм шифрования сводится к тому, что мы берём строку, преобразуем каждый символ в элемент массива, а затем кодируем строку по следующему принципу: знак «%» — выполняющий роль разделителя, затем берём по два элемента массива, переводим их в числа (ASCII код) и складываем, первый символ добавляем чистым (без перевода в ASCII код), а второй будет суммой чисел полученных ASCII кодов.
Дешифрование кода на JavaScript
<script type="text/javascript"> function decod(s) { s = s.split('%').slice(1); c = ''; for (i = 0; i < s.length; i++) { c += s[i].charAt(0) + String.fromCharCode(s[i].substr(1)-s[i].charCodeAt());; } document.write(c); } s = "<? echo $e ?>"; decod(s); </script> |
где:
функция split — преобразуем строку в массив, знак «%» выступает разделителем элементов массива;
функция slice — задаём индекс элемента в массиве, с которого будет начинаться новый массив;
функция charAt(0) — берём первый символ в каждом элементе массива;
функция substr(1) — берём все символы начиная со второго в каждом заданном элементе массива;
функция charCodeAt() — получаем ASCII код первого символа каждого элемента массива;
функция fromCharCode — преобразуем ASCII код в обычный символ.
функция document.write — выводим дешифрованную строку на странице.
Скачать файлы рабочего примера Security.zip
А Вам приходилось использовать какие-нибудь методы защиты текстов от копирования?
Делитесь своим опытом и идеями в комментариях.
Добавить комментарий