艺灵设计

全部文章
×

浅聊某sdn是如何实现未登录时屏蔽复制的

作者:艺灵设计 - 来源:http://www.yilingsj.com - 发布时间:2023-06-13 16:33:00 - 阅: - 评:0 - 积分:0

摘要:话说上次访问某sdn时,他还没有强制用户登录后才能复制内容,当时只是复制代码块时会提示要登录。但现在呢,文章主体区内容均无法复制,一复制就会出现一个强制登录的弹窗。这我能忍吗?掏出神器F12,研究了一会儿终于将其搞定。

友情提示:文章思路仅供交流,建议看官还是登录后再复制吧,毕竟人家也是要面子的~

一、上一次的屏蔽复制原理

大概在2个月前吧,某sdn上还是仅屏蔽未登录的用户无法复制代码。当时仅依靠CSS就拦截了一部分看官,引导他们登录。

可能看官会大呼:CSS有这么厉害吗?

当然了!

不信你来复制我(就是这一行文字)试试?[:偷笑]

操作步骤:
1、鼠标选中后,
2、再Ctrl+C
3、Ctrl+V粘贴

你会发现粘贴时无任何内容!但复制其他地方的文字就能成功复制。

1.1、原理:user-select

想实现此功能也很简单,只需要一行CSS代码即可。代码见下方↓↓↓

.user-select-none {
  user-select: none; /* 别看了,就是我屏蔽了你的复制功能。将none改为text即可恢复复制 */
}

有兴趣的看官可以去看看某sdn的页面,鼠标定位到代码区块时看右侧的style样式。
将code的user-select的值改为text后便可正常复制.png将code的user-select的值改为text后便可正常复制

当然了,直接使用这种方法是不行的!因为现在某sdn已经升级到用javascript来限制未登录用户复制的地步了。[:尴尬]

二、断点调试

如实说,这个断点调试是非常消耗时间的。如果思路不对,几天的时间都可能会被耗进去。还好,艺灵我花了近1个小时的时间,终于知道了他是如何拦截的。

2.1、整理资源

在开始前,我们需要先整理一下这个复制功能会涉及到哪些因素。

既然是复制,那就离不开快捷键Ctrl+C。既然有Ctrl键,那就可能会有ctrlKey事件,还有可能会有键盘码keyCode。除此之外,复制的话需要先选中内容,那就需要document.selectionwindow.getSelection()事件。还有那个一复制就出现的登录框。

事实上,他还用了jquery中的copy事件。好尴尬呀,我竟然忘记了这个。

有了上述提到的这些资源后,我便开始了一个个定位分析。这个分析过程是非常复杂的,也走了不少弯路。

2.2、为什么一复制就出现登录框?

我原以为他是把document.selection事件改写了,所以上来我就把目标定位到了关键字document.selection上。

一堆断点下来,发现这个没什么用处。看来我的常识经验在这次判断中误导了我。

后面又挨个把上面提到的资源都测试了下,结果发现原来复制跟登录框有关!相关代码见下方↓↓↓

var n = function() {
  window.csdn.loginBox.show({
    spm: "1001.2101.3001.9440"
  })
};
$("#content_views").unbind("keydown").bind("keydown", function(e) {
  if (e.ctrlKey && 67 == e.keyCode)
    return n(),
    !1
}),
$("#content_views").unbind("copy").bind("copy", function(e) {
  return n(),
  !1
})

执行copy事件时会触发登录框.png ↓↓↓执行copy事件时会触发登录框

注意这里有一个copy复制事件。他先用unbind来解绑copy复制事件,紧接着又重新绑定了copy复制事件。重点是下面的一行代码。

return n(),
!1

这行代码乍看起来可能有些不太习惯,我们用if进行改写下吧。

if (n()) {
  return true
} else {
  return false
}

由于函数n()调用了登录弹窗显示方法且没有直接的返回值,所以默认返回undefined。由于undefined条件不成立,所以会直接进入else条件中。也就相当于在执行copy复制事件时,直接返回了return false。这就是为什么在复制后粘贴时无任何内容的根本原因!

三、破解之道

3.1、法一:解绑copy事件

打开控制台,粘贴解绑copy复制事件的代码即可复制文件内容。

$("#content_views").unbind("copy")

然后我们就能轻松复制文章内的内容了。

需要注意的是,如果是代码区块,还需要使用1.1中的方法解除CSS后才能复制哦~

3.2、法二:remove删除大法

此法特点:
1、超级简单,适合不会代码的小白;
2、省时省力,不需要写一行代码!
3、不用担心电脑被植入恶意代码

演示步骤:

  1. 打开某sdn的任意一篇普通文章
  2. 按下键盘上的F12快捷键或右键-》审查元素。如果是Mac电脑,按下command + option + I或者是fn + F12
  3. 在元素(Elements)中任意区域点击一下,并按下Ctrl+F进行搜索
  4. 粘贴代码"content_views,此时页面会有黄色高亮,用鼠标点一下可定位到这个dom元素上
  5. 点击右侧的事件侦听器(Event Listeners),此时会看到有一系列事件。里面有一个事件为copy的js资源,直接点击删除(Remove)按钮

此时便能正常复制文章内容了。上述步骤配图:点击删除按钮后可恢复正常的复制功能.png ↓↓↓
点击删除按钮后可恢复正常的复制功能

3.2.1、去除复制内容中的版权信息

刚刚我们已经能复制了,但复制后会有版权信息,那怎样去掉呢?

同样是刚才的方法,挨个删除其他几个事件的js资源即可。参考上图,此处就不再赘述了。

现在再复制,粘贴后是干干净净的纯内容了哦!不带任何多余内容。

个人建议还是保留版权信息,方便溯源和尊重原作者。毕竟人家写篇文章也不容易嘛!

3.3、法三:安装插件

可能有看官说了,上面2种方法还是有些麻烦。有没有那种不用打开控制台、不用粘贴代码或手动删除就能实现复制的方法呀?

当然有了!你登录下不就好了嘛![:皮]

或者用相关软件截图后进行OCR识别也是可以的。[:皮]

开个玩笑哈!

为了方便大家一劳永逸,艺灵我开发了一款简版的浏览器插件。拖拽到浏览器中后便能使用,可随意复制文章内容和代码区块的代码哦!

安装步骤:

  1. 打开浏览器,在地址栏中粘贴chrome://extensions/并回车,勾选开发者模式
  2. 解压下载好的压缩包,进入文件夹后将后缀为.crx的插件拖拽到浏览器中
  3. 点击“添加”或“添加扩展程序”按钮。
  4. 访问某sdn上的一篇文章或刷新网页,当页面上出现一句“可以复制啦^o^”时,表示可以正常复制。

配图:安装浏览器插件.png ↓↓↓ 安装浏览器插件

3.3.1、chrome浏览器中无法使用?

如果看官使用的是Chrome浏览器,安装后会无法启动。主要原因是插件没有上架到谷歌商店。

至于原因嘛,你懂的。开发者需要支付$5刀的费用,玩不起呀![:流泪]

那有没有解决方法呢?

有的!看官把后缀.crx修改为.zip,然后解压压缩包。点击“加载已解压的扩展程序”,选择解压后的文件夹即可。

配图:加载已解压的扩展程序.png↓↓↓ 加载已解压的扩展程序

现在,使用chrome浏览器访问某sdn上的文章,不登录时也可以正常复制了哦!

3.4、资源下载

  1. 本站下载:[插件]移除某sdn复制限制v0.1.zip 免费
  2. 百度云:链接: https://pan.baidu.com/s/1qFI3qSUYoM3YWR6GYDdfiA?pwd=8jju 提取码: 8jju
  3. github下载:https://github.com/yilingsj/no-login-csdn-can-copy.git
转载声明:
  若亲想转载本文到其它平台,请务必保留本文出处!
本文链接:/xwzj/2023-06-13/copy-prohibited.html

若亲不想直保留地址,含蓄保留也行。艺灵不想再看到有人拿我的技术文章到他的地盘或者是其它平台做教(装)程(B)而不留下我的痕迹。文章你可以随便转载,随便修改,但请尊重艺灵的劳动成果!谢谢理解。

亲,扫个码支持一下艺灵呗~
如果您觉得本文的内容对您有所帮助,您可以用支付宝打赏下艺灵哦!

Tag: csdn 浏览器插件 css user-select f12 审查元素 断点调试 javascript copy selection getSelection

上一篇: bug复盘之如何优雅的实现表格跨页勾选   下一篇: 权限破解之一键复制某sdn上的代码块

评论区