防盗链,以及防盗链的实现

288 阅读2分钟

下面是对 防盗链(Hotlinking protection) 的介绍和在 Node.js(Express)中的实现方式 👇


🕵️‍♂️ 一、什么是防盗链?

防盗链是指防止其他网站直接引用你站点的静态资源(如图片、视频、文件等)以节省自己带宽、消耗你的服务器资源的行为。

🔗 举个例子:

某站点直接使用:

<img src="https://yourdomain.com/images/banner.jpg" />

👉 会造成你的网站资源被别人“白嫖”。


🔐 二、防盗链的常见实现原理

主要是通过检查请求头中的 RefererOrigin 来判断请求来源:

  • Referer 表示从哪个页面发起的请求。
  • 如果 Referer 不属于你自己的网站,就拒绝访问资源。

🚧 三、Express 中实现防盗链

示例:限制只有本站能访问图片

const express = require('express');
const path = require('path');
const app = express();

// 防盗链中间件
app.use('/images', (req, res, next) => {
  const referer = req.get('Referer');

  if (!referer || referer.startsWith('http://localhost:3000')) {
    // 本地或无 Referer(可选)
    next();
  } else {
    res.status(403).send('403 Forbidden - 防盗链拦截');
  }
});

// 静态资源目录
app.use('/images', express.static(path.join(__dirname, 'images')));

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000');
});

📂 四、其他防盗链实现方案(非 Node.js)

1. Nginx 配置防盗链

location /images/ {
    valid_referers none blocked yourdomain.com *.yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}

2. 前端防护:资源隐藏链接 + Token 授权

  • 图片 URL 设置为临时地址 + token(有效期短)
  • 后端验证 token 合法性

3. CDN 防盗链设置

CDN 服务(如阿里云、七牛云、Cloudflare)一般提供防盗链设置面板,可以配置白名单域名。


💡 五、Tips 与注意事项

项目建议
移动端请求有些浏览器可能不带 Referer,需要兼容
内部访问可以放行空 Referer
静态资源缓存防盗链结合 CDN 效果更佳
私有资源配合 token 验证更安全

如果你的网站有图片、视频、文档等资源,建议一定加上防盗链逻辑,或者用带授权验证的接口包装资源链接。