|
|
|
| Как и многие, в своё время я очень интересовался возможностью защиты контента от копирования. Понятно, что просто прочитать с экрана и перенабрать текст можно в любом случае. И снять контент через скриншот тоже всегда возможно. Или вынуть его из исходного кода. Но наибольший вред наносит не это, а обычный доступ через выделение / копирование, с помощью которого простые пользователи, коих большинство, растаскивают текст по форумам.
Поэтому все известные мне способы защиты сводились к тому, чтобы запретить в браузере именно операцию копирования. Однако ни один из известных мне запретов не распространялся на все браузеры, а без универсальности защита вообще теряла всякий смысл.
Но вот вчера супруга совершенно случайно встретила сайт, в котором имеется достаточно интересная защита, распространяющаяся и на ИЕ, и на ФФ, и на Хром, и даже на Опера (хотя на Опера не в полной мере). Очень хотелось бы понять, как программисты сумели этого достичь, но самостоятельно с этим я не справился.
Вот этот сайт: http://www.bp-arkadia.ru/
Как там устроена защита? | |
|
|
|
|
|
|
|
для: Владимир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}
|
| |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 11:48)
| | у меня не получается выделить даже при отключенном JScipt
но контектное меню появляется и скопировать с исходного кода страницы не составляет труда | |
|
|
|
|
|
|
|
для: Valick
(29.12.2011 в 11:53)
| | Последние пять строчек кода блокируют уже на уровне html 5, а это не javascript.
Еще нужно дописать от горячих клавиш для просмотра html кода и разрешить вызывать контекстное меню для ссылок, потому что если нельзя скопировать ссылку - это минус. | |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 12:06)
| | в любом случае от тех кому "ну очень хочется" это не спасет :)
хотя согласен для большинства пользователей сети это будет не по зубам | |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 11:48)
| | Однако, этого кода в коде главной страницы я не обнаружил!
Это какое-то самостоятельное программное решение? | |
|
|
|
|
|
|
|
для: Владимир55
(29.12.2011 в 17:39)
| | А он в отдельном файле
<script type="text/javascript" src="/js/jquery_ui_pers.js"></script>
| Возьмите путь /js/jquery_ui_pers.js и подставьте после домена - все увидите. | |
|
|
|
|
 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>
|
Или это работает только при вызове внешним скриптом? | |
|
|
|
|
 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 одинаковый). | |
|
|
|
|
|
|
|
для: Владимир55
(29.12.2011 в 19:11)
| | Я пока не нашел решения этого дефекта, но если оно есть - отпишусь когда найду как это побороть. | |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 20:53)
| | Решение, конечно же, должно быть - ведь одинаковые коды должны давать одинаковый результат. А если результаты различаются, то и коды хоть в чем-то различны. Ведь так? | |
|
|
|
|
|
|
|
для: Владимир55
(29.12.2011 в 17:54)
| | А как же обернуть скрипт в тег <script>?
Хотя в целях сокрытия конечно лучше вынести в отдельный файл, а еще лучше скрыть куда-нибудь в гугл аналитику и т.п. Хотя подождите, зачем его вообще скрывать? Не он же ценность представляет, а контент... | |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 20:50)
| | В теле сраницы код не заработал (см. автор: Владимир55 (29.12.2011 в 17:54) ). Либо я занес его как-то не так, либо без внешнего скрипта он и работать не должен. Этого я не знаю.
А как же обернуть скрипт в тег <script>?
Так он и на сайте, являющемся первоисточником, лежит вот в этом скрипте:
<script type="text/javascript" src="/js/jquery_ui_pers.js"></script>
|
| |
|
|
|
|
|
|
|
для: Владимир55
(29.12.2011 в 22:03)
| | Я подразумевал
<script>
// сюда поместить код
</script>
|
| |
|
|
|