“复制党”完了!前端这6招让你的网站内容谁都复制不走!

作者:程序员成长指北

原文:mp.weixin.qq.com/s/yTQ8PcDhw...

你辛辛苦苦码的字,别人 Ctrl+C 一下就搬走了?

你写的技术干货、原创文案、独家数据,别人一复制一粘贴直接换壳上线?
别慌,今天就来教你用技术手段把复制欲望打到原地坐牢!

第一招:禁止复制事件,打掉快捷键

从最简单也最常见的方法讲起:阻止浏览器的 copy 行为。

javascript 复制代码
document.addEventListener('copy', (e) => {
  e.preventDefault();
});

再加一把限制键盘操作的锁:

ini 复制代码
document.addEventListener('keydown', (e) => {
  if ((e.ctrlKey && (e.key === 'a' || e.key === 'c')) || e.key === 'F12') {
    e.preventDefault();
  }
});

用户按 F12?

关掉 JS?

「你挡得住我复制,还挡得住我技术进阶?」

第二招:CSS 限制选区,内容摸都摸不到

用 CSS 样式让内容无法被选中,用户连选都选不到,复制个啥?

sql 复制代码
.nocopy {
  user-select: none;
  -webkit-user-select: none;
}

再加个提示优化体验:

css 复制代码
.nocopy::after {
  content: "复制失败,请尊重原创 ✨";
  position: absolute;
  color: red;
}

用户体验就一句话:

「你写得是好,但我真复制不动啊。」

但开发者工具里随手一删样式,啥都回来了。

第三招:字体反制法,看到≠拿到

这招才是真正的"老六"操作。

DOM 里其实是一堆乱码:

ini 复制代码
<span class="anti-copy">㠁㑢</span>

但搭配专属的字体文件 .woff,浏览器渲染后你看到的是正常的"你好"。

你复制出来的还是㠁㑢------无意义内容。

之前知乎、某些小说站的 "禁止转载内容" 多半用的就是这个套路。

不过对高级用户来说,只要获取到字体文件,分析映射关系后仍然可以还原。如果是博客的话还是不建议使用,因为影响 SEO,爬虫读取无效内容;

第四招:画出来的文字你选个锤子

如果文字不是 HTML 元素,而是"画"出来的呢?

例如使用 SVGCanvas 渲染:

arduino 复制代码
<svg width="400" height="60">
  <text x="10" y="35" font-size="24">这不是文字,你复制试试看😎</text>
</svg>

或者:

ini 复制代码
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '24px sans-serif';
ctx.fillText('复制我啊~', 10, 50);
document.body.appendChild(canvas);

你看到的不是 DOM,而是一张图,选区功能彻底失效。

唯一对策:截图 + OCR + AI 识别,门槛不低。

第五招:自定义渲染引擎,复制彻底无解

最硬核的方式:完全接管渲染、交互、选区

不使用 DOM 结构,而是用虚拟渲染引擎,例如:

  • 自己写一个 Canvas 文本排版引擎
  • 控制光标、选区行为
  • 所有内容结构都不可见
ini 复制代码
// 文字绘制完全不依赖 HTML
ctx.fillStyle = '#000';
ctx.font = '16px Arial';
ctx.fillText('我不是DOM,复制不了', 10, 50);

这种方案难度高,SEO 炸裂,但安全性拉满。

如果你使用过 WPS 在线文档、部分阅读器,就可能体验过这种"你看得到,但复制不到"的渲染方式。

第六招:禁止打开控制台,发现就关你页!

控制台(F12)可是前端调试的好帮手,但有些老六级网站,偏偏不想你轻松调试它。于是------只要你敢按 F12,我就敢把你页面直接关了。

禁止打开控制台:拦截键盘事件

ini 复制代码
document.onkeydown = function (e) {
  // F12 键 或 Ctrl+Shift+I 组合键
  if (e.key === "F12" || (e.ctrlKey && e.shiftKey && e.key === "I")) {
    e.preventDefault();
  }
};

// 禁止右键菜单(辅助防止调试)
document.addEventListener('contextmenu', e => e.preventDefault());

检测控制台是否打开:尺寸判断 + debugger

javascript 复制代码
function detectDevTools() {
  const threshold = 160;
  const devtoolsOpen =
    window.outerWidth - window.innerWidth > threshold ||
    window.outerHeight - window.innerHeight > threshold;

  if (devtoolsOpen) {
    window.location.href = 'about:blank'; // 或者 window.close();
  }
}

setInterval(detectDevTools, 1000);

还可以加个debugger 延时判断,来检测用户是否打开了断点调试工具:

ini 复制代码
function checkDevtoolsByDebugger() {
  const start = performance.now();
  debugger; // 如果打开控制台,执行时间会延长
  const time = performance.now() - start;

  if (time > 100) {
    window.location.href = 'about:blank';
  }
}

setInterval(checkDevtoolsByDebugger, 2000);

看了一下现在知乎小说部分就是这么去做的:

让咋们无法使用F12打开控制台,打开控制台后再打开链接,就会关闭网页,确实挺狠。

但是也是有方案解决的,感兴趣可以留言,分享给你

🎯 写在最后

防复制从来都是猫鼠游戏:

  • 你加样式,他关 JS
  • 你乱字体,他逆推表
  • 你画出来,他截图识别
  • 你写渲染器,他训练 AI

防得住小白,挡不住老哥。

但在现实中,能拦住 90% 的复制者就已经是胜利了

相关推荐
该用户已不存在6 分钟前
8个Docker的最佳替代方案,重塑你的开发工作流
前端·后端·docker
然我7 分钟前
面试官最爱的 “考试思维”:用闭包秒杀递归难题 🚀
前端·javascript·面试
明月与玄武15 分钟前
HTML知识全解析:从入门到精通的前端指南(上)
前端·html
teeeeeeemo30 分钟前
CSS place-items: center; 详解与用法
前端·css·笔记
未来之窗软件服务34 分钟前
html读取身份证【成都鱼住未来身份证】:CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
前端·html·身份证读取
木木jio39 分钟前
🧹 前端日志查询组件的重构实践:从 1600 行巨型组件到模块化 hooks
前端·react.js
WAKEUP3691 小时前
TypeScript 类型系统简述:构建更健壮的代码基础
前端·typescript
難釋懷1 小时前
Vue-github 用户搜索案例
前端·vue.js