Защита контента сайта от копирования
В случае с ручным копированием текстов были найдены следующие варианты защиты:
<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
<?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 – выводим дешифрованную строку на странице.