Nodejs 如何防盗链
Nodejs 如何防盗链
如题, 方案最好是有效, 低成本的 另外帮忙简单说一下在nodejs上如何操作
4 回复
Node.js 如防盗链
防盗链是一种常见的安全措施,用于防止其他网站直接使用你的资源(如图片、视频等)而无需授权。这不仅有助于保护你的带宽,还可以防止内容被盗用。在 Node.js 中实现防盗链可以通过检查请求头中的 Referer 字段来完成。
基本原理
浏览器在发起请求时,通常会将当前页面的 URL 添加到 Referer
头中。服务器端可以根据这个头来判断请求是否来自合法来源。如果 Referer
头不存在或者不是预期的来源,则可以拒绝提供资源。
示例代码
以下是一个简单的 Node.js 应用程序示例,演示如何通过检查 Referer
头来防盗链:
const http = require('http');
const url = require('url');
// 定义允许访问资源的白名单
const allowedReferers = [
'https://example.com',
'https://another-example.com'
];
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url);
const pathname = parsedUrl.pathname;
// 检查路径是否为需要保护的资源
if (pathname.startsWith('/protected')) {
// 获取 Referer 头
const referer = req.headers.referer;
// 如果 Referer 不存在或不在白名单中,则拒绝请求
if (!referer || !allowedReferers.includes(new URL(referer).origin)) {
res.writeHead(403, { 'Content-Type': 'text/plain' });
res.end('Forbidden');
return;
}
}
// 允许请求
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Resource accessed successfully!');
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 白名单定义:首先定义一个数组
allowedReferers
,包含允许访问资源的站点。 - 请求处理:当请求到达时,解析请求的 URL,并检查路径是否为需要保护的资源(例如
/protected
)。 - 检查 Referer 头:获取
Referer
头,并将其与白名单进行比较。如果Referer
头不存在或不匹配白名单中的任何站点,则返回 403 状态码。 - 响应请求:如果请求合法,则返回资源。
这种方式简单且成本低,但请注意,Referer
头可以被客户端修改或删除,因此这种方法并不是绝对安全。对于更高级的安全需求,可以考虑使用其他方法,如生成和验证签名等。
session呗。
我用connect-mongo来存session, 如果一个页面有20个图片, 那么用户打开一次页面就要读20次数据库来确认session?
防盗链(Referer Checking)是一种防止资源被其他网站直接引用的方法。在 Node.js 中,可以通过中间件来实现这一功能。
示例代码
以下是一个简单的示例代码,展示如何在 Express 框架中实现防盗链:
const express = require('express');
const app = express();
// 需要保护的资源路径
const protectedPath = '/protected';
// 白名单中的域名列表
const refererWhitelist = [
'https://example.com',
'http://example.com'
];
app.use((req, res, next) => {
const referer = req.headers.referer;
// 如果请求路径是需要保护的资源路径,并且 referer 不在白名单中,则拒绝访问
if (req.path.startsWith(protectedPath) && !refererWhitelist.includes(referer)) {
return res.status(403).send('Access Forbidden');
}
next();
});
app.get('/protected', (req, res) => {
res.send('This is a protected resource.');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
引入 Express:
- 使用
express
创建一个 Express 应用实例。
- 使用
-
定义需要保护的资源路径:
- 在本示例中,所有以
/protected
开头的路径都需要进行防盗链检查。
- 在本示例中,所有以
-
定义白名单:
- 在
refererWhitelist
数组中列出允许访问这些资源的来源域名。
- 在
-
中间件:
- 定义一个中间件函数,用于检查请求的
referer
头是否包含在白名单中。 - 如果请求路径匹配到需要保护的资源,并且
referer
不在白名单中,则返回 403 状态码,并发送错误信息。
- 定义一个中间件函数,用于检查请求的
-
路由处理:
- 定义一个处理
/protected
路径的 GET 请求的路由,只有通过中间件检查后才能访问。
- 定义一个处理
-
启动服务器:
- 启动 Express 服务器,监听端口 3000。
注意事项
referer
头可以被客户端修改或删除,因此这只是一个简单的安全措施,不能作为唯一的防护手段。- 可以根据实际需求调整白名单中的域名列表。
这种方式的成本较低,而且可以根据需要灵活调整,适用于大多数基本的防盗链需求。