如何防止网页上的内容不被复制

坑军之王的头像
坑军之王
155

前语

我们在查资料的时候老是遇见此内容不能复制,需要充值会员/注册账号才能执行该操作的时候,肯定心里都能气炸了。在这里将对此内容的原理进行说明

实现原理

通过js修改document上的相关属性值来实现。首先分析下通过浏览器复制内容的关键点:

第一步就是要选中需要复制的内容,所以首先要禁止通过鼠标选中网页内容。

第二步就是开启复制内容,可以通过ctrl+c或者鼠标右键菜单,以及拖拽到新窗口获取。就需要禁止复制和网页右键菜单及页面的拖拽。

第三步需要屏蔽   属性,此属性可以实现网页的随意修改编辑。

核心代码

第一步检测上面所有的属性值是否都是false

第二步如果发现任何值为true的时候,就把对应的属性值修改为false,这里下面给到的代码是只要发现有true的值,会把所有属性都修改一遍,执行效率会低点,但是影响不大,懒了大家可以自己优化下。

第三步就是要防止用户在控制台修改属性值来实现修改,因为需要一个定时器每100毫秒检测下属性状态,有问题就重置下属性值。

<!DOCTYPE html>

<html> 

<head>    

<title>禁止复制教程</title>

<noscript>Your browser does not support JavaScript!</noscript>

</head>

<body>

<p>禁止复制演示</p>

</body>

<script>

function nocopy(){      

if(document.oncopy || document.oncontextmenu || document.onselectstart || document.ondragstart || document.body.contentEditable){

document.body.contentEditable=false;

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

setInterval(() => {      nocopy();    }, 100);

</script>

</html>

第四步需要对代码混淆加密下,然后找个js脚本,把上方的加密的js添加上去,就可以加大破解的难度。到此可以恭喜你可以屏蔽大多数人了。

eval(function(p,a,c,k,e,d){

e=function(c){

return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))

};

if(!''.replace(/^/,String)){

    while(c--)d[e(c)]=k[c]||e(c);

k=[function(e){

    return d[e]

}];

e=function(){

   return'\\w+'

};

c=1;

};

while(c--)

if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);

return p;

}('5 7(){a(0.3||0.4||0.2||0.6||0.8.1){0.8.1=9;0.3=0.4=0.2=0.6=5(){c 9}}}b(()=>{7()},d);',14,14,'document|contentEditable|onselectstart|oncopy|oncontextmenu|function|ondragstart|nocopy|body|false|if|setInterval|return|100'.split('|'),0,{}))


存在的缺陷

这个屏蔽网页内容的复制是基于js脚本实践的,但是如果用户通过浏览器禁止javascript的运行的时候,此方法就实效了。

所以,解决方法是在网页上加上js状态的检测,在网页上加一个简单的后台请求js,如果浏览器禁用js那么后端获取不到验证通讯,就停止内容的输出相应即可解决。

这样就更加的完善了,但是还是没有达到完美,如果用户通过F12或者打开调试窗口,那么就又沦陷了,不过别怕下期更新如何填补这个缺陷。

用户评论
评论列表