前端“伪防盗链”方案

前端"伪防盗链"方案

  1. 禁止文本选中与复制: user-select: none; .
  2. 禁用右键与拖拽:通过监听 contextmenu 和 dragstart 事件,禁止用户右键保存图片或拖拽图片。.
    方案一:原生 JavaScript(适用于所有项目)
js 复制代码
// 方案一:原生 JavaScript(适用于所有项目)
function protectImages() {
  // 1. 禁用右键菜单
  document.addEventListener('contextmenu', function(e) {
    // 判断点击的目标是否是图片
    if (e.target.tagName === 'IMG') {
      e.preventDefault(); // 阻止默认的右键菜单弹出
      console.log('右键保存图片已被拦截');
    }
  }, true); // 使用捕获阶段,确保在默认行为前拦截

  // 2. 禁用拖拽
  document.addEventListener('dragstart', function(e) {
    if (e.target.tagName === 'IMG') {
      e.preventDefault(); // 阻止图片被拖拽出浏览器
      console.log('图片拖拽已被拦截');
    }
  }, true);
}

// 在 DOM 加载完成后执行
document.addEventListener('DOMContentLoaded', protectImages);

方案二:Vue 3 自定义指令(推荐,最优雅)

如果你使用的是 Vue,强烈建议封装成一个自定义指令(Directive)。这样你只需要在需要保护的 标签上加一个 v-protect 即可,非常干净。

  • 创建指令文件(如 directives/protect.js):
ts 复制代码
export const protectDirective = {
  mounted(el) {
    // 确保只对 img 标签生效
    if (el.tagName !== 'IMG') return;

    // 禁用右键
    el.addEventListener('contextmenu', (e) => {
      e.preventDefault();
    });

    // 禁用拖拽
    el.addEventListener('dragstart', (e) => {
      e.preventDefault();
    });
  }
};
  • 在 main.js 中全局注册:
ts 复制代码
import { createApp } from 'vue';
import { protectDirective } from './directives/protect';

const app = createApp(App);
app.directive('protect', protectDirective);
app.mount('#app');
  • 在页面中使用:
html 复制代码
<!-- 只需要加上 v-protect,这张图片就被保护了 -->
<img src="/path/to/image.jpg" alt="受保护的图片" v-protect />

方案三:纯 CSS 辅助方案(防拖拽与选中)

css 复制代码
/* 禁止图片被选中 */
img {
  user-select: none; 
  -webkit-user-select: none; /* Safari 兼容 */
  
  /* 禁止长按弹出保存菜单(主要针对移动端) */
  -webkit-touch-callout: none; 
  
  /* 禁止拖拽 */
  pointer-events: none; /* ⚠️注意:这会导致图片上的点击事件也失效! */
}
  1. 禁止选中:在 CSS 中对图片添加 user-select: none; 属性。
  2. 添加透明水印:在图片上方覆盖一层半透明的水印图层,即使别人截图也会带上你的水印。
  3. 动态修改图片地址:不直接暴露真实的图片 URL,而是通过 JS 动态拼接加密参数,增加直接抓取链接的难度。
相关推荐
LucianaiB11 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel11 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易13 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰15 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
IT_陈寒15 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
强尼银手15 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
石小石Orz15 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
陈随易16 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
总要学点什么16 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
10share16 小时前
基于大模型的 i18n 方案:把中文原文当 Key,轻松搞定多语言维护
前端·vue.js