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');
});

解释

  1. 白名单定义:首先定义一个数组 allowedReferers,包含允许访问资源的站点。
  2. 请求处理:当请求到达时,解析请求的 URL,并检查路径是否为需要保护的资源(例如 /protected)。
  3. 检查 Referer 头:获取 Referer 头,并将其与白名单进行比较。如果 Referer 头不存在或不匹配白名单中的任何站点,则返回 403 状态码。
  4. 响应请求:如果请求合法,则返回资源。

这种方式简单且成本低,但请注意,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');
});

解释

  1. 引入 Express:

    • 使用 express 创建一个 Express 应用实例。
  2. 定义需要保护的资源路径:

    • 在本示例中,所有以 /protected 开头的路径都需要进行防盗链检查。
  3. 定义白名单:

    • refererWhitelist 数组中列出允许访问这些资源的来源域名。
  4. 中间件:

    • 定义一个中间件函数,用于检查请求的 referer 头是否包含在白名单中。
    • 如果请求路径匹配到需要保护的资源,并且 referer 不在白名单中,则返回 403 状态码,并发送错误信息。
  5. 路由处理:

    • 定义一个处理 /protected 路径的 GET 请求的路由,只有通过中间件检查后才能访问。
  6. 启动服务器:

    • 启动 Express 服务器,监听端口 3000。

注意事项

  • referer 头可以被客户端修改或删除,因此这只是一个简单的安全措施,不能作为唯一的防护手段。
  • 可以根据实际需求调整白名单中的域名列表。

这种方式的成本较低,而且可以根据需要灵活调整,适用于大多数基本的防盗链需求。

回到顶部