Несколько способов защиты контента от копирования

26 октября 2013 | Автор: | Категория: JQuery и PHP

На этой неделе столкнулся с необходимостью защитить контент на одном из сайтов от копирования. Ситуация заключалась в том, что на сайте есть закрытая часть, которая не видна поисковикам, здесь посетители оставляют свои заказы. Кто-то начал грабить парсером, либо копировать тексты заказов вручную и выкладывать их на своих говносайтах, использовать как контент для генерации доров и т.п. В общем, стал вопрос о том, как защитить тексты от копирования.
Защита контента

В случае с ручным копированием текстов были найдены следующие варианты защиты:

<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

А Вам приходилось использовать какие-нибудь методы защиты текстов от копирования?

Делитесь своим опытом и идеями в комментариях.

Для этой страницы комментарии закрыты.