0x00 前言
在往常我们可能会不可避免的碰到一些禁止复制粘贴的网站,比如我最近工作的时候拿到过一些日常必须要用到的系统,但是它就是禁止粘贴密码,导致我办公时不太方便,所以为了解决这种问题,遂出一期文章和大家共同学习一下其绕过思路。
注:由于实现禁止复制粘贴的方案有多种,所以这种解决方案我可能会一期一期出,因为我一时间可能也碰不到那么多案例。
0x01 正文
直接上图:

我们可以看到在这个password表单中有一个onpaste事件,查一下这个事件是做什么的(https://www.runoob.com/jsref/event-onpaste.html):

可以看到,如果设置了该事件,当用户粘贴文本到该表单时就会触发该事件设置的js,以下是一个样例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=\, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text" onpaste="alert('用户粘贴了内容')">
</body>
</html>
看一下效果:

实现禁止粘贴就用我上文给大家展示的那套系统中的做法即可:直接往里面写个return false:

此时用户就不能粘贴内容到这个表单了,解决方案很简单,我们只需要在网页加载完毕后动态获取该元素修改onpaste事件即可,以下是我针对上面那个系统写的hook绕过代码:
let flag = 0;
function temp_fun() {
if (document.title.indexOf("xxxx") !== -1 && flag === 0) {
var pwd = document.getElementById('pwd');
console.log(pwd.onpaste);
pwd.onpaste = null;
console.log(pwd.onpaste);
flag = 1;
}
}
setInterval(temp_fun, 100);
看下效果:

只要我们将目标元素的onpaste事件设置为null即可,这样就能成功的实现粘贴内容了。整个实现思路其实不难,需要讲的就是setInterval,我将具体修改onpaste事件的代码写到了temp_fun函数里,然后用setInterval每隔0.1秒去执行它,这么做是因为我们可能不会太确定脚本具体会在文档加载前运行还是加载后运行,虽然油猴为我们提供了几个运行时期:

https://juejin.cn/post/7011062158460977183:

但我第一次没有用定时器时并将运行时期设置为document-end后发现并没有获取到目标元素,也就是说虽然脚本是在document-end时运行的,但其实文档还没有加载完毕,所以无奈之下我只能写个定时器来获取目标元素,这样基本就没什么问题了。

















请登录后查看评论内容