防盗链(Hotlink Protection)是指防止其他网站未经授权直接链接和使用你的资源(如图片、音视频、文档等)。盗链会导致带宽消耗增加、成本上升,用户订阅减少、收入下降,甚至可能引发版权纠纷。因此,防盗链技术在保护资源和维护权益方面至关重要。
以下是一些常见的防盗链方案:
基于 Referer 和 User-Agent 头的防盗链
这是最常见的防盗链方法,通过检查 HTTP Referer、User-Agent 头部,确定请求资源的来源,来判断请求是否来自合法的浏览器或应用网站。如果不符合预期,则拒绝请求。这种方法可以防止一些基本的爬虫或脚本的盗链,但容易被伪造。
server { location / { valid_referers none blocked server_names *.example.com; if ($invalid_referer) { return 403; } if ($http_user_agent ~* "(curl|wget|python|scrapy)") { return 403; } } }
基于 IP 白名单的防盗链
只允许特定的 IP 地址或 IP 段访问资源,其他 IP 地址的请求一律拒绝。这种方法适用于访问者固定的情况,如公司内网、CDN 源站回源。对于动态 IP 或大规模用户访问的场景,这种方法的适用性较低。
实现方式:
server { location / { allow 192.168.1.0/24; deny all; } }
基于 Token 的防盗链
在资源 URL 中添加一个临时有效的 Token,服务器验证该 Token 是否有效。如果无效,则拒绝访问。这种方法常用于视频流和其他高价值资源。
实现方式:
- 生成 Token:服务器在用户请求资源时生成一个带有时效性的 Token,并将其附加到资源 URL 中。
- 验证 Token:服务器在资源请求时验证 Token 的有效性。
示例 URL:
https://example.com/resource.jpg?token=abc123
基于签名 URL 的防盗链
在生成资源 URL 时,将一些参数(如路径、过期时间等)进行签名,形成一个带签名的 URL,服务器验证签名的有效性。这种方法适合需要高安全性的场景,如 CDN 保护。
实现方式:
- 生成签名 URL:服务器在生成资源 URL 时,使用密钥对 URL 进行签名。
- 验证签名:服务器在资源请求时,验证 URL 中的签名。
示例 URL:
https://example.com/resource.jpg?expires=1609459200&signature=abcd1234
动态生成资源 URL
每次请求资源时,动态生成资源的 URL,且 URL 具有时效性或一次性使用特性。这种方法类似于 Token 验证,但更加灵活和安全。
实现方式:
- 服务器生成动态 URL,并附加到页面或返回给客户端。
- 服务器验证 URL 的有效性,并在首次请求后失效。
使用验证(码)机制
在用户访问资源之前,要求用户输入验证码以证明其人类身份。这种方法主要防止自动化程序的盗链,但对用户体验有一定影响。
实现方式:
- 用户请求资源时,弹出验证码输入框。
- 验证通过后,生成临时访问令牌或直接返回资源。
常见的验证方式包括数字验证码、短信验证码、图形验证码、滑动解锁和 Google reCAPTCHA。这些方法虽然有效,但可能会影响用户体验和隐私。
这里特别介绍一下 Cloudflare Turnstile。它的工作方式如下:
- 初步判断:Turnstile 首先根据访问者的基本信息判断用户是否为真实人类。如果确定是人类,则直接返回请求的资源。如果确定是机器爬虫,则拦截请求。
- 进一步验证:如果无法确定访问者身份,Turnstile 会运行一系列小型非交互式 JavaScript 质询。这些质询包括工作证明、空间证明、Web API 探测,以及检测浏览器行为和人类行为的各种质询。

Turnstile 会记录这些请求的特性和结果,并将其用于机器学习模型,并不断强化模型,以便更好地识别和处理以后具有相似特性的请求。
这种机制不仅有效防止了自动化程序的盗链,还能确保真实用户获得良好的体验。
DRM 数字版权管理
DRM 是一种技术,用于保护数字内容的版权,防止未经授权的复制和使用。通常用于视频、音频、电子书等内容的保护,但其应用范围也可以扩展到其他类型的数字内容,如软件、文档等。
DRM 支持的媒体类型:
- 视频:常见的 DRM 系统如 Apple FairPlay、Google Widevine 和 Microsoft PlayReady 都支持视频内容的保护,常用于电影、电视节目、流媒体服务等。
- 音频:音乐和有声读物等音频内容也常使用 DRM 进行保护。
- 电子书:电子书 DRM 保护技术用于防止电子书的未经授权复制和分发。
- 文档:一些企业使用 DRM 保护敏感文档和文件,确保只有授权用户可以访问。
- 软件:软件 DRM 用于防止盗版和未经授权的使用。
以视频为例,DRM 保护的基础步骤如下:
- 视频加密:
- 在视频内容发布之前,使用加密算法对视频文件进行加密。常用的加密算法包括 AES(高级加密标准)。
- 加密后的视频文件无法直接播放,需要解密才能观看。
- 许可证(License)生成和管理:
- 生成许可证文件,其中包含解密密钥和权限信息。
- 许可证由 DRM 服务提供商管理,并在用户请求访问内容时分发。
- 内容分发:
- 加密视频通过流媒体服务器或 CDN 分发给用户。
- 用户请求播放视频时,客户端应用向 DRM 服务器请求许可证。
- 许可证验证和获取:
- 用户的客户端应用向 DRM 服务器发送请求,验证用户的访问权限。
- 验证通过后,DRM 服务器向客户端发送许可证文件。
- 视频解密和播放:
- 客户端应用使用许可证中的解密密钥对视频内容进行解密。
- 解密后的视频内容在用户的设备上播放。
DRM 保护视频内容涉及加密、许可证管理、内容分发和解密播放等多个环节。不过任何基于软件的加密解密方案在理论上都有被破解的可能性,但 DRM 的目标是增加破解的难度和成本,使得非法使用变得不切实际。
如何保护 3D 内容
元宇宙时代的到来,使得 3D 模型的应用和需求迅速增长。这些 3D 模型不仅用于娱乐和游戏,还广泛应用于教育、培训、设计、虚拟购物等各个领域。在这样的背景下,保护 3D 模型的版权和确保其安全性显得尤为重要。
上面提到的 DRM 系统如 Apple FairPlay、Google Widevine 和 Microsoft PlayReady,主要设计用于保护音视频内容,特别是用于流媒体传输中的数字版权管理。它们并不是为保护 3D 模型内容而设计的。然而,通过某些特定的方式和技术手段,它们可以被用于保护 3D 模型内容,但这通常需要额外的工作和特定的实现方案(ChatGPT 的结论,笔者并未验证,仅供参考)。
但是我们可以参考 DRM 的设计规范,采用类似的技术,具体来说就是采用加密技术和许可证管理来保护 3D 模型的版权。
具体步骤如下:
- 加密模型文件:使用加密算法(如 AES)对 3D 模型文件进行加密。
- 分发许可证:在用户合法购买或获得模型后,颁发一个许可证,其中包含解密所需的密钥和权限信息。
- 内容解密与使用:用户在使用 3D 模型时,通过 DRM 客户端或集成的解密代码验证许可证并解密模型文件。
示例:
后端:使用 Node.js 加密 3D 模型
const fs = require('fs'); const crypto = require('crypto'); // 设置密钥和初始化向量 (IV) const key = crypto.randomBytes(32); // 32 字节密钥 const iv = crypto.randomBytes(16); // 16 字节 IV // 加密函数 function encrypt(filePath, outputFilePath) { const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); const input = fs.createReadStream(filePath); const output = fs.createWriteStream(outputFilePath); return new Promise((resolve, reject) => { input.pipe(cipher).pipe(output); output.on('finish', () => resolve()); output.on('error', (err) => reject(err)); }); } // 加密 3D 模型 const filePath = 'path/to/your/model.glb'; const outputFilePath = 'path/to/encrypted_model.glb'; encrypt(filePath, outputFilePath).then(() => { console.log('Model encrypted successfully!'); console.log('Key:', key.toString('hex')); console.log('IV:', iv.toString('hex')); }).catch(err => { console.error('Encryption failed:', err); });
客户端:需要使用许可证中的密钥和 IV 解密 3D 模型,然后通过 <model-viewer> 等组件展示模型。
async function decryptModel(encryptedData, key, iv) { const algorithm = { name: 'AES-CBC', iv: iv }; const cryptoKey = await crypto.subtle.importKey('raw', key, algorithm, false, ['decrypt']); const decryptedData = await crypto.subtle.decrypt(algorithm, cryptoKey, encryptedData); return new Blob([decryptedData], { type: 'model/gltf-binary' }); } async function loadModel() { // 从服务器获取加密的模型文件 const response = await fetch('/path/to/encrypted_model.glb'); const encryptedData = await response.arrayBuffer(); // TODO:从服务器获取许可证,包含密钥和权限信息 const key = new Uint8Array([/* your key bytes here */]); const iv = new Uint8Array([/* your iv bytes here */]); const decryptedBlob = await decryptModel(encryptedData, key, iv); const url = URL.createObjectURL(decryptedBlob); document.querySelector('#model-viewer').src = url; } loadModel();
具体可执行代码:
总结
防盗链技术是保护在线资源免受未经授权访问的关键手段。
每种防盗链方案都有其优势和劣势。Referer & User-Agent 验证、Token 验证、IP 验证和验证码验证、DRM 等技术可以有效防止盗链,但其实现复杂度和对用户体验的影响也各不相同。选择合适的方案需要根据具体的业务需求和技术条件来决定。
Everything is a Trade-off。
总的来说,防盗链技术需要在保护内容的合法使用权和提供良好用户体验之间找到最佳平衡点。希望本文对你理解和实施防盗链技术有所帮助,能够在攻防博弈中做出明智的选择。