Coding 的痕迹

一位互联网奔跑者的网上日记

0%

解除网站简单复制限制

写在前面

各位读者好,这里是笔者 Orbit,本文由 sunnysab 代发,感谢 sunnysab 提供个人博客平台!

本文的示例网站(防止网站所有者自搜,已用 base64 编码): aHR0cHM6Ly93d3cuNTFjeWguY29tL2dvbmd6dW96b25namllLzM3NDk3MS5odG1s

本文介绍了如何解除某网站的复制限制,共四个部分

分析网站代码

打开网页,选取一段内容,当按下 Ctrl-C 或者右键复制时,网页弹出充值提示框,且无法粘贴。由于防复制行为出现在复制动作后,所以考虑站方通过 js 监听复制动作的可能性,
查看网页源代码,找出所有 <script> 代码块,依次查看,找到一处疑似代码(为了观感删除部分非必要代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
var content_id = '300137';
var userid = '';
var is_vip = '';
var timer = null;
if ((navigator.userAgent.match(/(phone|pad|WebOS)/i))) {
document.write('<script type="text/javascript" src="/statics/essay/js/pubuliu_m.js"><\/script>');
document.write('<script type="text/javascript" src="/statics/essay/js/cptm.js"><\/script>');
} else{
document.write('<script type="text/javascript" src="/statics/essay/js/copy_pc.js"><\/script>');
}
</script>

代码1 疑似代码

这段代码根据客户端的种类加载 js 文件,笔者使用 PC 端,加载了 copy_pc.js 文件,文件名似乎暗示与防复制有关,打开 “F12 开发者工具 - 网络选项”,加载一次网页,找到 copy_pc.js,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 复制事件
$(document.body).bind({
copy: function (e) {
var d_name = 'down_url_' + content_id;
var conInfo = $.cookie(d_name);
if (userid) {
// 过滤是不是Vip
if (is_vip == false) {
$('.pop').show();
$('.open_vip').show();
// 关闭所有兄弟节点
$('.open_vip').siblings().hide();
return false;
}
} else {
// 已经付款的文章
if (!conInfo) {
$('.pop').show();
$('.open_vip').show();
// 关闭所有兄弟节点
$('.open_vip').siblings().hide();
return false;
}
}
}
});

代码2 copy_pc.js

从注释来看无疑是防复制代码,这段代码调用 jQuery 的 bind 函数,将 <body> 标签的 copy 事件和防复制函数绑定。

经过调查实践,是否阻止复制动作取决于函数的返回值(false 为阻止,true 不阻止)。
因此解除复制限制的思路有以下三种:

  1. 修改 userid 变量和 is_vip 变量绕过 return false 语句
  2. 修改 conInfo 变量绕过 return false 语句
  3. 解除 <body> 标签的事件绑定

实践 & 分析

思路1

通过查询, useridis_vip 变量出现在网页源代码中,恰好在“代码1”处定义,初始为空值。通过为其赋值来跳过 if 语句,在控制台输入:

1
2
userid = '1';
is_vip = '1';

执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。

思路2

conInfo 变量于 “代码2” 定义,与之关联的还有 d_name 变量。代码2 调用 jQuery 操作 Cookie 的方法,将 Cookie 中名为 d_name 的值赋值给 conInfo 变量。

由于 conInfo 变量在复制动作开始后才被定义赋值,所以通过在控制台修改并不能改变其值,那么自然想到干预 Cookie 内容,控制台输入:

1
$.cookie('down_url_' + content_id, '1');

执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。

思路3

既然通过 jQuery 绑定 copy 事件,那么一定有解除绑定的方法,一通百度后找到 unbind 方法,控制台输入:

1
$(document.body).unbind('copy');

执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。

编写油猴脚本

上面三种思路,任意一种都可以做到单次解除复制限制,然而关闭浏览器、再次打开网页后,除了持久化的 Cookie 信息,其余两种思路都要再输入一次,脑内 RAM 就那么多,干脆写个油猴脚本,每次打开该类网站自动执行控制台输入。

新建油猴脚本,根据提示将三种思路代码加入其中,将开头 @match 注解的内容修改为示例网站,最后在 “设置 - 通用 - 运行时期” 选择 “document-end”,保存。

随想随记

  1. 网页源代码中有个有趣的处理,在 HTML 中通过条件拉取对应的 js 文件,这点在“代码1”中有体现。

  2. 从结果来看,先排查获得的 js 文件然后根据文件名猜功能能快速定位防复制代码,除非前端把防复制代码写到 HTML 里面。

  3. 示例网站把文章内容直接写在了 <body> 中,最佳解决方法是将网页源代码解析成富文本或者 Word 文档,可惜俺不会_(:з」∠)_。

  4. 不仅把文章内容直接写在了 <body> 中,连传输的 js 文件都是明文看不懂还有注释前端TA真的我哭死,期待稍微有点难度的挑战。

  5. 欢迎大家讨论和批评指正,再次感谢 sunnysab 的大力支持✿ヽ(°▽°)ノ✿

欢迎关注我的其它发布渠道