防复制就不多说了,整合了一下 JS 和 CSS 防复制的方法,应该还是比较全的
检测开发者工具的话,整合了各种较新的方法,经测试是支持 Chrome (包括单独窗口打开的情况)和 Firefox (在单独窗口打开时,只有打开控制台时才能检测到),其他浏览器还没有测试,不过估计 chromium 内核的浏览器也都是支持的
最后放个链接求 star: https://github.com/Netrvin/PageGuard.js
1 golmic 2018-05-04 18:41:48 +08:00 via Android ![]() 有啥意义。。 |
![]() | 2 x86 2018-05-04 18:45:19 +08:00 view-source: url |
![]() | 3 tyrealgray 2018-05-04 18:47:47 +08:00 打开调试在 Sources 里依然能看到 example.html |
4 oonnnoo 2018-05-04 19:00:15 +08:00 via Android wget,curl 下载下来 |
![]() | 5 Greatshu 2018-05-04 19:05:37 +08:00 wireshark |
6 ccqy66 2018-05-04 19:15:56 +08:00 本质上浏览器上能看到的内容是 http 响应的渲染。只要拿到 http 响应。什么技术都没有用。 |
7 xavier007 2018-05-04 19:16:57 +08:00 防小白,禁止复制就够了,对于程序员,还是知道如何开启开发者工具,另外禁止了 JS,也就不起作用了 |
![]() | 8 131 OP @xavier007 毕竟看网上的“防复制教程”里面有用开发者工具的,而且国内很多浏览器内核都是 chromium 的,所以一定程度上也能防范 |
![]() | 9 131 OP @oonnnoo 建议是让网页在 Javascript 被禁用时无法正常显示;动态获取 /生成网页内容,一定程度上给分析源码添堵 |
![]() | 10 131 OP @golmic 在一些应用场景中还是有用的,而且一些特殊场景更可以限制你必须用 chrome,还可以一发现你用开发者工具就封号 |
![]() | 11 autoxbc 2018-05-04 20:03:22 +08:00 via iPhone ![]() 你加班写个防复制,他加班给破掉了,码农互相伤害,何苦呢 |
12 billlee 2018-05-04 20:08:56 +08:00 然后我点了一下「剪藏到印象笔记」 |
![]() | 14 gzlock 2018-05-04 20:19:47 +08:00 via Android 整页截图再 ocr 了解一下? |
![]() | 15 131 OP @autoxbc 其实主要就是整合了一下这些方法,省得找零碎的东西了;另外,这些东西不都是为了增加破解成本吗,成本上去了,自然愿意花时间的人就少了 |
![]() | 18 schema 2018-05-04 20:58:54 +08:00 via Android 各取所需嘛,支持下开源项目 |
![]() | 19 Ellison 2018-05-04 21:01:42 +08:00 还不如把内容做好点 |
![]() | 20 geelaw 2018-05-04 21:09:02 +08:00 ![]() 感觉不是很有意义 - - 而且在 Edge 上会无条件执行 handler。 使用 toString 方法检测是一个很糟糕的事情 toString is supposed to be side-effect free。 |
22 afpro 2018-05-04 21:13:01 +08:00 防复制还是有意义的 防开发者工具就很鸡肋了 这类玩意一般都是做成油猴之类的给 PM 和运营做 量大就 headless chrome 不会有程序猿自己开开发者工具复制你的内容的 |
![]() | 23 opengps 2018-05-04 21:24:02 +08:00 via Android 先打开 f12,然后输入网址 |
![]() | 26 ledzep2 2018-05-04 22:56:44 +08:00 既然是开发者, 这点小障碍肯定是越得过的拉 |
![]() | 28 letitbesqzr 2018-05-04 23:30:13 +08:00 ![]() 最近我们这面也有个需求,要收集一下具体哪些用户在我们的网页打开过控制台。 我们的做法是利用 sourceMapping,在网站上引入一个通过程序生成的 js,最后加上 souceMapping 的路径,路径和当前登录的用户有关联,监听这个地址,就能够知道是谁打开了。我测试过,只要一打开 chrome 控制台就会去加载 sourceMapping。虽然这东西在控制台里面可以禁止,但是默认都是开启的。没有必要去防御,毕竟都是丢给用户的游览器上执行的了,几乎没有什么是扰不过的。 |
![]() | 29 chinvo 2018-05-04 23:39:17 +08:00 学 ReCAPTCHA 搞个 bytecode vm WebSockets + WebRTC 下发 bytecode 并且检查中间人攻击的可能性 执行 bytecode 得到客户端解密逻辑和密钥 |
![]() | 30 chinvo 2018-05-04 23:40:38 +08:00 刚刚不小心按了 command + enter orz WebSockets 下发分段密文和 IV 用 bytecode 里面的逻辑解密 bytecode 渲染内容到 canvas 完美 |
![]() | 31 131 OP @letitbesqzr 感想提供思路 |
![]() | 33 misaka19000 2018-05-05 00:21:45 +08:00 |
![]() | 34 131 OP ![]() |
35 azh7138m 2018-05-05 01:03:57 +08:00 via Android 移动端有阅读模式,chrome+Firefox 都有 |
![]() | 36 binux 2018-05-05 01:12:23 +08:00 挺好的,我有一个 headless 浏览器,https://github.com/sindresorhus/devtools-detect 检测不到,你的可以 |
![]() | 38 131 OP @azh7138m 那个测试页面比较单调(简陋),所以阅读模式能够较好的工作。正常的页面有一大堆其它的文本和样式,所以阅读模式的效果是没那么好的(而且可以人工插一堆看不见的字符来混淆之类的) |
![]() | 39 noe132 2018-05-05 02:30:29 +08:00 ![]() 防复制我只服那个动态生成随机字体的 |
![]() | 40 O3YwA1ENkb7i35XJ 2018-05-05 10:51:22 +08:00 用 fiddler 把加载的这个 js 指向 404, 万事大吉. |
![]() | 42 mlhorizon 2018-05-05 11:25:59 +08:00 ![]() Tampermonkey 脚本打个勾就破了,楼主继续加油。 |
![]() | 44 131 OP @mlhorizon 我这里测试无法复现,请再试一下;有可能是因为 10 秒钟到了之后,网页自动解除的限制,这是为了展示解除限制的功能 |
![]() | 45 nosay 2018-05-05 14:21:06 +08:00 突然想起年少时,追书时候的那些手打天团... 所以,只要你敢公开,只要有价值,哪怕非程序员,也会通过简单粗暴的方式拿到他想要的,23333 |
![]() | 47 Mysdes 2018-05-05 15:13:06 +08:00 ![]() Chrome 上的 Allow Copy 插件 ![]() |
48 AX5N 2018-05-05 15:28:11 +08:00 这么做有什么意义吗?复制不来的都是普通人,如果连普通人都利用不了你网站的东西,你网站还存在什么价值吗? |
49 icy37785 2018-05-05 15:33:37 +08:00 via iPhone @AX5N #48 有意义呀,这个轮子很多场景下面是很有用的(至少在我部分项目下有用)。每个轮子都是针对特定场景下有用的。 |
![]() | 50 qsnow6 2018-05-05 15:46:23 +08:00 ![]() |
52 icy37785 2018-05-05 16:02:52 +08:00 via iPhone @AX5N #51 你这话题我肯定不接的,上面也是也是出于这种考虑所以我只说某些场景下面有用,如果我明确跟你说明哪些场景有用,你会跟我说用 xx 工具,xx 方法一样可以,然后我需要跟你解释 xx 工具盒 xx 方法为什么在这个场景下不适用,然后很有可能针对到底 xx 方法 xx 工具适不适用成为一个没有结局的对话,但是对于适不适用这个问题,不接触特定场景是理解不了的,所以这对话必然没结果,必然没结果的话题当然是不去开始比较好。这些轮子本来就是对于接触一些场景的人来说是有用的,对于不涉及特定场景的人来说没用的,我至少跟你说对部分人有用比如我的部分项目,既然对部分人有用那么就是有意义了。不知道我这样说你能不能认同。 |
![]() | 55 PP 2018-05-05 16:10:15 +08:00 “许看不许摸”,这是自主权。支持楼主的想法,欢迎楼主的作品! |
![]() | 56 UIXX 2018-05-05 16:18:23 +08:00 ![]() ...这个工具属于“不够有用”,它意味着该效果在应用场景上 1、可以在常规用户上奏效 2、不可以在目标用户上奏效 3、常规用户跟目标用户并不高度重合 举个例子,在线答题,对于一般的考生他认认真真答题,发现不能复制那没什么。这个属于常规用户使用。如果一个考生铁了心要上网查答案,那你这个工具破解的成本太低了。而恰恰后一种用户才是我们开发这个工具所要防范的群体。 |
![]() | 57 131 OP @UIXX 嗯,确实,考生完全可以打字、语音、截屏查,还可以直接问人;所以大型正规考试基本上都是线下的(但还可能带个蓝牙耳机或者口袋里放个手机) |
![]() | 58 131 OP @UIXX 所以可能应用在不希望被复制的,文字多的场景更好,这样子再换个字体之类的,如果你真的有毅力手打。。。那也没辙 |
![]() | 59 codehz 2018-05-05 16:32:07 +08:00 via Android 没考虑可访问性 api 直接读取网页文字的问题,建议干掉所有文字改用图片渲染 |
![]() | 60 131 OP @codehz 对,innerText 直接就能读,不过这个 JS 里弄图片渲染还要考虑各种普适性之类的问题,所以。。。就没考虑用这个方法 |
61 AX5N 2018-05-05 16:53:59 +08:00 |
![]() | 64 est 2018-05-05 17:17:43 +08:00 via Android 66666 |
![]() | 65 zeroDev 2018-05-05 17:43:32 +08:00 via Android 明白了,就是如何把人往死里整 2333 |
![]() | 66 131 OP |
![]() | 67 codehz 2018-05-05 18:18:53 +08:00 via Android @131 不是 innerText,是给盲人用的屏幕阅读器,不受 js 限制,只要是文本,都可以读,对付这种方法,只能靠图片了 |
![]() | 68 zhjits 2018-05-05 23:45:23 +08:00 via iPhone 之前做过一个内部项目用 Screen Reader API 复制网页文本 在做之前还开过脑洞 hook GDI+/Direct2D API is 直接把程序画的字读出来 |
![]() | 70 yankebupt 2018-05-06 00:41:05 +08:00 然后哪天被哪个恶意的植入了挖矿脚本,防开发工具调试用的 js 就被当成病毒加的壳一起检测了,然后域名因为无法调试确认病毒责任直接入了云防毒黑名单,是不是就舒服了。 纯脚本防屏蔽感觉做差不多就得了,真想防复制感觉像各种在线文献阅读网站似的要个 flash 或什么插件权限,别管真防假防当时吓住一大票人。 |
71 openmynet 2018-05-06 01:13:35 +08:00 Javascript:(function() { let html = document.documentElement.cloneNode(true); let jsNodes = html.querySelectorAll("script"); jsNodes.forEach(element => { element.parentElement.removeChild(element); }); let forceCopyWin = window.open("", "force"); forceCopyWin.document.documentElement.innerHTML = html.innerHTML; })(); |
72 openmynet 2018-05-06 01:39:01 +08:00 ![]() 优化下: Javascript: (function() { let html = document.documentElement.cloneNode(true); let jsNodes = html.querySelectorAll("script"); jsNodes.forEach(element => { element.parentElement.removeChild(element); }); let base = document.createElement("base"); base.href = window.location.origin + window.location.pathname; html.querySelector("head").appendChild(base); let forceCopyWin = window.open("", "forceCopy"); forceCopyWin.document.documentElement.innerHTML = html.innerHTML; })(); |
74 openmynet 2018-05-06 01:54:55 +08:00 代码直接放在浏览器书签里直接点,地址栏不会出现焦点丢失。 |
76 ho121 2018-05-06 09:34:13 +08:00 via Android 右键另存为?/div> |
77 ho121 2018-05-06 09:36:17 +08:00 via Android 防复制不如转成图片 |
![]() | 78 gelilaohuang 2018-05-06 15:09:25 +08:00 |
![]() | 79 131 OP @gelilaohuang download and (rename or insert) |
80 Roycom 2018-06-28 13:23:44 +08:00 全站直接图片输出 |