以为配置了基础防盗链结果别人换个 Referer 就轻松绕过以为上了 HLS 加密结果在Network 面板里密钥 URL 明晃晃。防盗链这事很多人把防链接被盗用和防内容被盗取搞混了。前者 Nginx 就能解决后者是个完全不同量级的问题。本文把方案分成三层诸位可根据自己内容的价值和预算选对应层级进行防盗一、L1 基础防护Referer 校验 Token 签名 URL防护对象防小白用户直接复制链接盗用资源防护能力★★☆☆☆开发成本低1.Nginx Referer 防盗链这是最经典的防盗链手段。原理很简单检查 HTTP 请求头中的Referer字段只允许来自你自己域名的请求访问资源。Nginx 配置示例server { listen 80; server_name www.example.com; # 视频文件防盗链 location ~* \.(mp4|flv|avi|wmv|mkv)$ { valid_referers none blocked server_names *.example.com example.com; if ($invalid_referer) { return 403; # 非法来源直接返回 403 # 或者返回一个提示图片/视频 # rewrite ^/ /static/403.png break; } root /data/videos; expires 7d; add_header Cache-Control public, no-transform; } # PDF 文件防盗链 location ~* \.pdf$ { valid_referers none blocked server_names *.example.com; if ($invalid_referer) { return 403; } root /data/documents; # 禁止浏览器直接下载强制在线预览 add_header Content-Disposition inline; add_header X-Content-Type-Options nosniff; } }valid_referers参数说明参数含义none允许没有 Referer 的请求如直接在地址栏输入 URLblocked允许 Referer 被防火墙/代理删除的请求server_names允许当前 server_name 配置的域名*.example.com允许所有子域名局限性Referer 可以被轻松伪造。用户只需一个浏览器插件如 Referer Control或一行 curl 命令就能绕过# 伪造 Referer 直接下载视频 curl -H Referer: https://www.example.com -o stolen.mp4 \ https://www.example.com/videos/course-01.mp42. Nginx secure_link 签名 URL比 Referer 校验更进一步secure_link模块通过MD5 签名 时间戳过期来保护资源链接。即使链接被复制超过有效期后也无法访问。Nginx 配置server { listen 80; server_name www.example.com; location /videos/ { # secure_link 由两个参数组成签名值 和 过期时间戳 secure_link $arg_sign,$arg_t; # 签名生成规则MD5(过期时间 URI 密钥) secure_link_md5 $arg_t$uri YOUR_SECRET_KEY; # 签名校验失败 if ($secure_link ) { return 403; } # 链接已过期 if ($secure_link 0) { return 410; # 410 Gone } root /data; } }后端签名 URL 生成Python 示例import hashlib import base64 import time def generate_signed_url(file_path, secret_key, expire_seconds3600): 生成带签名的防盗链 URL :param file_path: 资源路径如 /videos/course-01.mp4 :param secret_key: 与 Nginx 配置一致的密钥 :param expire_seconds: 链接有效期秒 expire_time int(time.time()) expire_seconds # 签名规则须与 secure_link_md5 一致 raw f{expire_time}{file_path} {secret_key} md5_hash hashlib.md5(raw.encode()).digest() sign base64.urlsafe_b64encode(md5_hash).rstrip(b).decode() return fhttps://www.example.com{file_path}?sign{sign}t{expire_time} # 使用示例生成一个 2 小时有效的视频链接 url generate_signed_url(/videos/course-01.mp4, YOUR_SECRET_KEY, 7200) print(url) # 输出类似https://www.example.com/videos/course-01.mp4?signabc123def456t1742345678效果链接具有时效性过期后自动失效。比纯 Referer 校验强了一个等级。局限性链接在有效期内仍可被分享无法阻止用户下载后转发原文件。总结方案能防什么防不了什么Referer 校验外站直接嵌入盗用Referer 伪造、下载后传播secure_link 签名 URL链接被转发过期失效有效期内的分享、录屏、下载适用场景对安全要求不高的公开资源、图片CDN防盗链。不适用付费课程、机密文档、高价值内容二、L2 应用层防护HLS 加密 PDF.js 防下载防护对象防普通技术用户下载和拷贝原始文件防护能力★★★☆☆开发成本中等1. HLS AES-128 视频加密HLSHTTP Live Streaming协议原生支持 AES-128 加密。视频被切片并加密后播放器需要先获取密钥才能解密播放。即使用户下载到.ts分片文件没有密钥也无法播放。Step 1生成加密密钥# 生成 16 字节的 AES-128 密钥 openssl rand 16 enc.key # 生成 16 字节的 IV初始化向量 openssl rand -hex 16 # 输出示例a]b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5Step 2创建密钥信息文件创建enc.keyinfo文件如下https://www.example.com/keys/enc.key /path/to/enc.key ab1c2d3e4f5a6b7c8d9e0f1a2b3c4d5三行分别是密钥的远程 URL、密钥本地路径、IV 值。Step 3使用 FFmpeg 切片并加密ffmpeg -i input_video.mp4 \ -codec: copy \ -start_number 0 \ -hls_time 10 \ -hls_list_size 0 \ -hls_key_info_file enc.keyinfo \ -hls_segment_filename segment_%03d.ts \ output.m3u8生成的 m3u8 文件内容示例#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:11 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHODAES-128,URIhttps://www.example.com/keys/enc.key,IV0xab1c2d3e4f5a6b7c8d9e0f1a2b3c4d5 #EXTINF:10.010000, segment_000.ts #EXTINF:10.010000, segment_001.ts ...Step 4Nginx 配置密钥接口鉴权密钥接口是整个方案的核心必须添加鉴权# 密钥接口 - 仅允许已登录用户获取 location /keys/ { # 校验用户 Cookie 或 Token auth_request /auth/verify; add_header Access-Control-Allow-Origin https://www.example.com; add_header Cache-Control no-cache, no-store; root /data; }局限性HLS 加密的密钥通过 HTTP 传输可以通过浏览器开发者工具Network 面板或抓包工具Fiddler / Charles直接获取密钥 URL然后用密钥解密所有.ts分片——这意味着# 攻击者通过 F12 拿到密钥 URL 后可以直接下载解密 curl -o enc.key https://www.example.com/keys/enc.key # 然后用 ffmpeg 合并解密 ffmpeg -allowed_extensions ALL -i output.m3u8 -c copy decrypted.mp4即使加了鉴权已登录的付费用户自己就能通过抓包拿到密钥。2. PDF.js 前端防下载/防复制对于 PDF 资料可以使用 PDF.js 渲染器将 PDF 渲染为 Canvas 画布同时禁用右键菜单、选择文本和打印功能。核心实现代码!DOCTYPE html html head titlePDF 安全阅读器/title script srchttps://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js/script style /* 禁止文本选择 */ body { user-select: none; -webkit-user-select: none; -moz-user-select: none; } canvas { display: block; margin: 10px auto; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } /* 隐藏打印时的内容 */ media print { body { display: none !important; } } /style /head body div idpdf-container/div script // 禁用右键菜单 document.addEventListener(contextmenu, e e.preventDefault()); // 禁用常见快捷键CtrlS / CtrlP / CtrlC / F12 document.addEventListener(keydown, e { if ( (e.ctrlKey [s,p,c,u].includes(e.key.toLowerCase())) || e.key F12 || (e.ctrlKey e.shiftKey e.key I) ) { e.preventDefault(); return false; } }); // 从后端获取 PDF不暴露直接下载链接 async function loadPDF() { const response await fetch(/api/pdf/render?idDOC_001, { headers: { Authorization: Bearer getToken() } }); const arrayBuffer await response.arrayBuffer(); const pdf await pdfjsLib.getDocument({ data: arrayBuffer }).promise; const container document.getElementById(pdf-container); for (let i 1; i pdf.numPages; i) { const page await pdf.getPage(i); const scale 1.5; const viewport page.getViewport({ scale }); const canvas document.createElement(canvas); canvas.width viewport.width; canvas.height viewport.height; container.appendChild(canvas); await page.render({ canvasContext: canvas.getContext(2d), viewport: viewport }).promise; // 叠加水印 addWatermark(canvas, User: zhangsan | ID: 10086); } } function addWatermark(canvas, text) { const ctx canvas.getContext(2d); ctx.save(); ctx.globalAlpha 0.08; ctx.font 20px Microsoft YaHei; ctx.fillStyle #000; ctx.translate(canvas.width / 2, canvas.height / 2); ctx.rotate(-Math.PI / 6); for (let y -canvas.height; y canvas.height; y 120) { for (let x -canvas.width; x canvas.width; x 300) { ctx.fillText(text, x, y); } } ctx.restore(); } loadPDF(); /script /body /html后端接口Node.js / Express 示例const express require(express); const fs require(fs); const app express(); // PDF 渲染接口 —— 不提供文件下载只返回二进制流 app.get(/api/pdf/render, authMiddleware, (req, res) { const docId req.query.id; const filePath getFilePath(docId); // 根据文档ID查找文件路径 if (!fs.existsSync(filePath)) { return res.status(404).json({ error: Document not found }); } // 关键设置响应头阻止浏览器下载行为 res.setHeader(Content-Type, application/pdf); res.setHeader(Content-Disposition, inline); // inline 而非 attachment res.setHeader(X-Content-Type-Options, nosniff); res.setHeader(Cache-Control, no-store); // 禁止缓存 fs.createReadStream(filePath).pipe(res); });局限性这很重要绕过方式难度说明F12 开发者工具★☆☆在 Network 面板中直接看到 PDF 请求右键 → Save Response禁用 JavaScript★☆☆浏览器设置关闭 JS所有前端防护全部失效浏览器插件★★☆如 SingleFile、PDF Download 等插件直接提取截屏/录屏★☆☆无法从前端阻止操作系统级的截屏和录屏前端防护的本质困境一切在用户浏览器中运行的代码用户都有最终控制权。前端防护只能增加门槛无法真正防住。总结方案能防什么防不了什么HLS AES-128 加密直接下载 ts 文件无法播放抓包获取密钥后解密、录屏PDF.js 前端防护小白用户的右键保存和复制F12 抓包、禁用 JS、截屏录屏适用场景中等价值的内容愿意投入一定开发成本能接受防君子不防小人的效果。不适用高价值课程、机密文件、需要严格版权保护的场景。三、L3 DRM 级防护硬件加密 防录屏 设备绑定防护对象防专业盗版抓包、虚拟机、录屏软件防护能力★★★★★开发成本极高自建/ 零使用成熟方案1. 什么是 DRMDRMDigital Rights Management数字版权管理是一套从硬件到软件的完整内容保护体系。与 L1、L2 的应用层防护不同DRM 在操作系统层面和硬件层面进行加解密用户无法通过浏览器开发者工具或抓包软件绕过。主流 DRM 方案对比DRM 方案厂商支持平台安全等级接入难度WidevineL1-L3Android / Chrome / Firefox高高需申请授权FairPlayAppleiOS / macOS / Safari高高需 Apple 开发者账号PlayReadyMicrosoftWindows / Edge / Xbox高高国密 SM2 自研 DRM国产方案全平台高极高自建/ 低第三方自建 DRM 系统涉及密钥管理服务器、License Server、客户端 SDK 集成、多平台适配开发成本动辄百万级且需要持续投入对抗新型盗版技术。2. DRM 级防护的核心能力一个完整的 DRM 方案需要覆盖以下能力加密层端侧加密解密密钥不经过云端传输。对视频、文档、音频、软件等核心内容做高强度加密AES、国密、私有加密算法防护层防截屏、防录屏实时检测并拦截防抓包下载非 HTTP 明文传输密钥防虚拟机检测沙箱环境并拒绝播放管控层设备绑定限PC/手机、平板数量观看次数/时长限制账号防共享溯源层用户ID跑马灯随机位置滚动显示多维度水印手机号设备型号时间戳盗录后可精准追溯到个人3. 为什么 L1 L2 防不住专业盗版用一张表说清楚盗版手段L1 Nginx防盗链L2 HLS加密PDF.jsL3 DRM级防护伪造 Referer 盗链❌ 防不住✅ 不依赖Referer✅复制链接分享⚠️ 签名URL可缓解⚠️ 有密钥仍可解密✅ 设备绑定F12 抓包下载❌❌ 可抓到密钥✅ 端侧加密录屏软件OBS等❌❌ 完全无法阻止✅ 实时检测拦截虚拟机录制❌❌ 完全无法阻止✅ 沙箱检测账号共享/拼课❌❌✅ 设备绑定限次手机拍屏❌❌⚠️ ID水印可溯源结论很清晰L1 和 L2 只能解决链接被盗用的问题对于内容被盗录/盗取完全无能为力。而这恰恰是内容创作者最核心的痛点。4. 自建 vs 使用成熟方案对比维度自建 DRM 系统成熟 DRM 方案开发周期6-12个月即开即用成本数十万至百万会员费维护成本需持续对抗新盗版技术平台持续更新多平台适配需逐一开发已全平台覆盖适合对象大型企业、平台级公司个人创作者、中小团队对于绝大多数内容创作者来说自建 DRM 的投入产出比极低。你的核心竞争力应该放在内容创作上而不是去造防盗版的轮子。冷杉云库fircloud.com。把L3 级别的内容防护 变现一体化平台。把企业级 DRM 能力打包成了个人创作者也能用的产品能力说明金融级加密量子密钥 国密 SM2 算法端侧加密解密密钥不上云防录屏/截屏实时检测录屏软件和截屏操作触发即黑屏拦截防抓包/防虚拟机阻断 Fiddler、Charles 等抓包工具和虚拟机环境设备绑定可分别限制 PC、手机、平板的绑定数量防拼课ID 跑马灯用户信息随机显示在视频画面上盗录可精准溯源多维水印手机号 设备型号 时间戳拍屏也能追踪到人观看次数限制按累计播放时长控制杜绝无限次回放商城变现生成购买链接/二维码一键支付自动分账技术背景方面冷杉云库的加密技术由深盾科技30 年安全加密领域企业提供支持持有7 项专利、2 项著作权。并且配备了专业的反黑实验室持续追踪和对抗新型盗版技术。如果你是网课老师、培训机构、知识付费创作者或者任何需要分发付费内容的个人/团队可以去搜索【冷杉云库】看看