阻止网页文字复制需多层防护:拦截selectstart事件、禁用右键和快捷键、css设置user-select:none,并配合服务端图片/css渲染、动态水印等策略,但无法完全杜绝。

在网页中阻止用户复制文字,不能单靠拦截 selectstart 事件就实现完全防护,但它是关键一环。需配合多种手段协同防御,且必须明确:前端防护无法真正杜绝复制(用户可禁用 JS、查看源码、截图等),目标应是提高复制门槛、防止无意或批量抓取。
拦截 selectstart 并阻止默认行为
selectstart 是文本选中开始时触发的事件,在 Chrome、Edge、Firefox 中均支持。需在目标元素或 document 上监听并调用 event.preventDefault():
- 直接绑定到敏感容器(如含机密内容的
<div id="secret">)更精准,避免影响全站交互 <li>注意:仅阻止鼠标拖选,键盘 <code>Ctrl+A触发的全选不会触发该事件,需额外处理 - 示例代码:
document.getElementById("secret").addEventListener("selectstart", e => e.preventDefault()); - 监听
contextmenu事件并阻止右键菜单:element.addEventListener("contextmenu", e => e.preventDefault()); - 监听
keydown拦截Ctrl+C、Ctrl+A、Cmd+C等组合键:element.addEventListener("keydown", e => { if ((e.ctrlKey || e.metaKey) && (e.key === "c" || e.key === "a")) e.preventDefault(); }); - 注意:部分快捷键(如
Ctrl+U查看源码)无法被 JS 拦截,属浏览器安全限制 - 对敏感区域设置 CSS:
#secret { user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } - 该样式会抑制大部分选中行为(包括双击、三击),但某些场景下仍可能被绕过(如通过开发者工具临时删掉样式)
- 配合 JS 的
selectstart拦截,形成双重保险 - 优先采用图片渲染敏感字段(如身份证号、金额),规避文本提取可能(但牺牲可访问性和 SEO)
- 使用 canvas 渲染文字,使内容不可被选中、无 DOM 节点对应
- 对关键页面启用动态水印(含用户 ID、时间戳),既不阻止复制,但让泄露内容可溯源
- 后端响应头添加
X-Content-Type-Options: nosniff和Content-Security-Policy限制脚本注入,防止恶意篡改防护逻辑
禁用右键菜单与快捷键组合
仅拦 selectstart 不够,还需封堵常见复制入口:
禁用用户选中样式与 CSS 控制
视觉上消除可选中提示,降低用户尝试意愿:
服务端配合与内容交付策略
真正敏感信息不应以纯文本形式暴露在 DOM 中:











