Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита контента
 
 автор: Владимир55   (29.12.2011 в 11:32)   письмо автору
 
 

Как и многие, в своё время я очень интересовался возможностью защиты контента от копирования. Понятно, что просто прочитать с экрана и перенабрать текст можно в любом случае. И снять контент через скриншот тоже всегда возможно. Или вынуть его из исходного кода. Но наибольший вред наносит не это, а обычный доступ через выделение / копирование, с помощью которого простые пользователи, коих большинство, растаскивают текст по форумам.

Поэтому все известные мне способы защиты сводились к тому, чтобы запретить в браузере именно операцию копирования. Однако ни один из известных мне запретов не распространялся на все браузеры, а без универсальности защита вообще теряла всякий смысл.

Но вот вчера супруга совершенно случайно встретила сайт, в котором имеется достаточно интересная защита, распространяющаяся и на ИЕ, и на ФФ, и на Хром, и даже на Опера (хотя на Опера не в полной мере). Очень хотелось бы понять, как программисты сумели этого достичь, но самостоятельно с этим я не справился.

Вот этот сайт: http://www.bp-arkadia.ru/

Как там устроена защита?

  Ответить  
 
 автор: deimand   (29.12.2011 в 11:48)   письмо автору
 
   для: Владимир55   (29.12.2011 в 11:32)
 

Вот она. Просто скопируйте себе и Вас будет)

function preventSelection(element){
  var preventSelection = false;

  function addHandler(element, event, handler){
    if (element.attachEvent)
      element.attachEvent('on' + event, handler);
    else
      if (element.addEventListener)
        element.addEventListener(event, handler, false);
  }
  function removeSelection(){
    if (window.getSelection) { window.getSelection().removeAllRanges(); }
    else if (document.selection && document.selection.clear)
      document.selection.clear();
  }
  function killCtrlA(event){
    var event = event || window.event;
    var sender = event.target || event.srcElement;

    if (sender.tagName.match(/INPUT|TEXTAREA/i))
      return;

    var key = event.keyCode || event.which;
    if (event.ctrlKey && key == 'A'.charCodeAt(0))  
    {
      removeSelection();

      if (event.preventDefault)
        event.preventDefault();
      else
        event.returnValue = false;
    }
  }

  addHandler(element, 'mousemove', function(){
    if(preventSelection)
      removeSelection();
  });
  addHandler(element, 'mousedown', function(event){
    var event = event || window.event;
    var sender = event.target || event.srcElement;
    preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i);
  });


  addHandler(element, 'mouseup', function(){
    if (preventSelection)
      removeSelection();
    preventSelection = false;
  });


  addHandler(element, 'keydown', killCtrlA);
  addHandler(element, 'keyup', killCtrlA);
}

        document.ondragstart = test; 
        preventSelection(document);
        document.onselectstart = test;
        document.oncontextmenu = test;
        function test() {return false}

  Ответить  
 
 автор: Valick   (29.12.2011 в 11:53)   письмо автору
 
   для: deimand   (29.12.2011 в 11:48)
 

у меня не получается выделить даже при отключенном JScipt
но контектное меню появляется и скопировать с исходного кода страницы не составляет труда

  Ответить  
 
 автор: deimand   (29.12.2011 в 12:06)   письмо автору
 
   для: Valick   (29.12.2011 в 11:53)
 

Последние пять строчек кода блокируют уже на уровне html 5, а это не javascript.

Еще нужно дописать от горячих клавиш для просмотра html кода и разрешить вызывать контекстное меню для ссылок, потому что если нельзя скопировать ссылку - это минус.

  Ответить  
 
 автор: Valick   (29.12.2011 в 13:14)   письмо автору
 
   для: deimand   (29.12.2011 в 12:06)
 

в любом случае от тех кому "ну очень хочется" это не спасет :)
хотя согласен для большинства пользователей сети это будет не по зубам

  Ответить  
 
 автор: Владимир55   (29.12.2011 в 17:39)   письмо автору
 
   для: deimand   (29.12.2011 в 11:48)
 

Однако, этого кода в коде главной страницы я не обнаружил!

Это какое-то самостоятельное программное решение?

  Ответить  
 
 автор: cheops   (29.12.2011 в 17:49)   письмо автору
 
   для: Владимир55   (29.12.2011 в 17:39)
 

А он в отдельном файле
<script type="text/javascript" src="/js/jquery_ui_pers.js"></script>
Возьмите путь /js/jquery_ui_pers.js и подставьте после домена - все увидите.

  Ответить  
 
 автор: Владимир55   (29.12.2011 в 17:54)   письмо автору
83.7 Кб
 
   для: cheops   (29.12.2011 в 17:49)
 

Вот оно что! Хитрецы...

Однако у меня получается то, что в скриншоте.

А вцелом код страницы такой:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Новая страница 1</title>

function preventSelection(element){ 
  var preventSelection = false; 

  function addHandler(element, event, handler){ 
    if (element.attachEvent) 
      element.attachEvent('on' + event, handler); 
    else 
      if (element.addEventListener) 
        element.addEventListener(event, handler, false); 
  } 
  function removeSelection(){ 
    if (window.getSelection) { window.getSelection().removeAllRanges(); } 
    else if (document.selection && document.selection.clear) 
      document.selection.clear(); 
  } 
  function killCtrlA(event){ 
    var event = event || window.event; 
    var sender = event.target || event.srcElement; 

    if (sender.tagName.match(/INPUT|TEXTAREA/i)) 
      return; 

    var key = event.keyCode || event.which; 
    if (event.ctrlKey && key == 'A'.charCodeAt(0))   
    { 
      removeSelection(); 

      if (event.preventDefault) 
        event.preventDefault(); 
      else 
        event.returnValue = false; 
    } 
  } 

  addHandler(element, 'mousemove', function(){ 
    if(preventSelection) 
      removeSelection(); 
  }); 
  addHandler(element, 'mousedown', function(event){ 
    var event = event || window.event; 
    var sender = event.target || event.srcElement; 
    preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i); 
  }); 


  addHandler(element, 'mouseup', function(){ 
    if (preventSelection) 
      removeSelection(); 
    preventSelection = false; 
  }); 


  addHandler(element, 'keydown', killCtrlA); 
  addHandler(element, 'keyup', killCtrlA); 


        document.ondragstart = test;  
        preventSelection(document); 
        document.onselectstart = test; 
        document.oncontextmenu = test; 
        function test() {return false} 


</head>

<body>
ПРОБА
</body>

</html>


Или это работает только при вызове внешним скриптом?

  Ответить  
 
 автор: Владимир55   (29.12.2011 в 19:11)   письмо автору
1.7 Кб
 
   для: Владимир55   (29.12.2011 в 17:54)
 

При подключении внешним скриптом работает.

Код страницы получается такой:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Новая страница 1</title>
<script type="text/javascript" src="hide.js"></script>
</head>
<body>
ПРОБА два
</body>
</html>


Файл hide.js в приложении и он содержит полный код, приведенный выше.

Но появился странный дефект при работе с ФФ (только с этим браузером). А именно:
Правка - Выделить всё - Копировать содержимое заносится в буфер.

А у сайта, с которого взят этот код, при работе с этим же браузером код не копируется!

Может, влияет какое-то различие в настройках сервера?
(DOCTYPE одинаковый).

  Ответить  
 
 автор: deimand   (29.12.2011 в 20:53)   письмо автору
 
   для: Владимир55   (29.12.2011 в 19:11)
 

Я пока не нашел решения этого дефекта, но если оно есть - отпишусь когда найду как это побороть.

  Ответить  
 
 автор: Владимир55   (29.12.2011 в 21:59)   письмо автору
 
   для: deimand   (29.12.2011 в 20:53)
 

Решение, конечно же, должно быть - ведь одинаковые коды должны давать одинаковый результат. А если результаты различаются, то и коды хоть в чем-то различны. Ведь так?

  Ответить  
 
 автор: deimand   (29.12.2011 в 20:50)   письмо автору
 
   для: Владимир55   (29.12.2011 в 17:54)
 

А как же обернуть скрипт в тег <script>?

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

  Ответить  
 
 автор: Владимир55   (29.12.2011 в 22:03)   письмо автору
 
   для: deimand   (29.12.2011 в 20:50)
 

В теле сраницы код не заработал (см. автор: Владимир55 (29.12.2011 в 17:54) ). Либо я занес его как-то не так, либо без внешнего скрипта он и работать не должен. Этого я не знаю.

А как же обернуть скрипт в тег <script>?

Так он и на сайте, являющемся первоисточником, лежит вот в этом скрипте:
<script type="text/javascript" src="/js/jquery_ui_pers.js"></script>

  Ответить  
 
 автор: deimand   (29.12.2011 в 22:05)   письмо автору
 
   для: Владимир55   (29.12.2011 в 22:03)
 

Я подразумевал

<script>
// сюда поместить код
</script>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования