CORS不能防止HTML标签直接盗链,仅能保护JavaScript主动发起的跨域请求;防img/video盗链需用Referer检查、签名URL或Nginx valid_referers。

CORS(跨域资源共享)本身不是为防盗链设计的,它的核心作用是允许或限制浏览器发起的跨域请求,比如 fetch 或 XMLHttpRequest。而盗链(hotlinking)通常指第三方网站在 <img>、<video>、<script> 等 HTML 标签中直接引用你的资源 URL——这类请求不触发 CORS 检查,因为它们属于“简单跨域资源加载”,浏览器不会发送预检请求,也不校验响应头中的 Access-Control-Allow-Origin。
所以:
✅ CORS 可以保护 API 接口或 JS 主动发起的资源请求;
❌ 但无法阻止 <img src="https://yoursite.com/logo.png"> 这类直接盗链。
不过,如果你的资源是通过 JavaScript 动态加载(例如用 fetch() 获取图片 blob 再渲染),那就可以用 CORS 控制——这时才真正生效。
一、CORS 能管住哪些“盗链”场景?
- 用户在自己网页里写 JS,调用你的
/api/image?name=xxx接口获取图片数据; - 前端 SPA 应用通过
fetch('/assets/data.json')加载配置; - 第三方嵌入你提供的 JS SDK,并请求你后端的受控资源。
这些行为会走浏览器的 CORS 协议,服务端可严格校验来源。
二、Node.js + Express 中正确配置 CORS 防盗链(JS 主动请求)
const express = require('express');
const cors = require('cors');
const app = express();
// ✅ 白名单方式:只允许指定域名发起 fetch/XHR 请求
const corsOptions = {
origin: ['https://trusted-site.com', 'https://admin.yoursite.com'],
credentials: true // 如需带 cookie,前端也要加 { credentials: 'include' }
};
app.use('/api', cors(corsOptions)); // 仅对 /api 路由启用
app.get('/api/photo', (req, res) => {
res.json({ url: '/protected/photo.jpg' });
});⚠️ 注意:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
origin: '*'会放行所有域名,起不到防盗链作用; - 如果前端用
<img>直接加载/protected/photo.jpg,这个请求完全绕过 CORS,服务器根本收不到Origin头,也无需返回Access-Control-*响应头。
三、真正防 <img> 类盗链,得靠 Referer 或签名 URL
CORS 不适用时,推荐组合使用:
-
Referer 检查中间件(轻量有效):
app.use('/protected', (req, res, next) => { const referer = req.get('referer'); if (!referer || !referer.includes('yoursite.com')) { return res.status(403).send('Forbidden: Direct linking not allowed'); } next(); }); app.use('/protected', express.static('private-assets')); 签名 URL(更安全):生成带时效和 IP 绑定的链接,如
https://yoursite.com/signed/abc123.jpg?t=1726512000&s=sha256...
后端验证签名再返回文件,彻底杜绝静态 URL 复用。-
Nginx 层 valid_referers(推荐生产环境用):
location /protected/ { valid_referers none blocked yoursite.com *.yoursite.com; if ($invalid_referer) { return 403; # 或重定向到提示图:rewrite ^/.*\.(jpg|png)$ /static/blocked.png break; } }
四、小结:CORS 在防盗链中的定位
- 它是「浏览器主动请求」的安全栅栏,不是「HTML 标签直引」的防火墙;
- 想防
<img><video>盗链 → 用 Referer、签名 URL、Nginx 配置; - 想防 JS 脚本盗取接口数据 → CORS 白名单 + token 鉴权更可靠;
- 不建议单独依赖 CORS 做防盗链,容易误以为“已防护”,实则形同虚设。
不复杂但容易忽略。

















