80 # 图片防盗链

简介: 80 # 图片防盗链

referer 来源,表示这个资源被谁引用过,可以用来做防盗链。

我们新建文件 no-referer.js

const fs = require("fs");
const path = require("path");
const url = require("url");
const http = require("http");
http.createServer((req, res) => {
    const { pathname } = url.parse(req.url, true);
    const absPath = path.join(__dirname, pathname);
    fs.stat(absPath, (err, statObj) => {
        if (err) res.end("Not Found");
        console.log("absPath----->", absPath);
        console.log("statObj----->", statObj);
        if (statObj) {
            console.log(statObj.isDirectory());
            console.log(statObj.isFile());
            if (statObj.isFile()) {
                fs.createReadStream(absPath).pipe(res);
            } else {
                res.end("Not Found");
            }
        } else {
            res.end("Not Found");
        }
    });
}).listen(3000);

新建文件 index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>凯小默测试图片防盗链</title>
        <!-- <meta name="referrer" content="never" /> -->
    </head>
    <body>
        <img src="http://127.0.0.1:3000/docker.jpg" alt="" />
    </body>
</html>

添加两张图片

启动服务:

nodemon no-referer.js

访问 http://127.0.0.1:3000/docker.jpg,可以看到图片直接打开是不会增加 referer 的

我们另外用 live server 启动服务,访问 http://127.0.0.1:5500/doc/80/index.html,我们可以看到图片的请求头加上了 referer

如果要实现引用我的人和我的域不是同一个,应该返回错误图片,我们应该进行校验

const fs = require("fs");
const path = require("path");
const url = require("url");
const http = require("http");
http.createServer((req, res) => {
    const { pathname } = url.parse(req.url, true);
    const absPath = path.join(__dirname, pathname);
    fs.stat(absPath, (err, statObj) => {
        if (err) return res.end("Not Found");
        console.log("absPath----->", absPath);
        console.log("statObj----->", statObj);
        if (statObj) {
            console.log(statObj.isDirectory());
            console.log(statObj.isFile());
            if (statObj.isFile()) {
                // 只对图片进行防盗链,如果请求路径是 .jpg 结尾的需要判断引用的来源
                if (/\.jpg/.test(absPath)) {
                    let referer = req.headers["referer"] || req.headers["referrer"];
                    if (referer) {
                        // 拿 host 跟 referer 比较
                        let host = req.headers.host;
                        refererHost = url.parse(referer).host;
                        console.log("host----->", host);
                        console.log("refererHost----->", refererHost);
                        if (host !== refererHost) {
                            fs.createReadStream(path.resolve(__dirname, "referer.jpg")).pipe(res);
                            return;
                        }
                    }
                }
                fs.createReadStream(absPath).pipe(res);
            } else {
                res.end("Not Found");
            }
        } else {
            res.end("Not Found");
        }
    });
}).listen(3000);

我们启动服务,访问 http://127.0.0.1:5500/doc/80/index.html,我们可以看到 docker 的图片访问不了,而是展示了防盗的图片

nodemon referer.js

要展示 docker 图片的话,我们就应该去访问 访问 http://127.0.0.1:3000/index.html,保证域相同

另外可以加上 meta 标签,不带 referer,如果网站没有 referer 会导致发送任何资源都不会带 referer

<meta name="referrer" content="never" />

注意:单词 referer 是错误的写法,正确的单词应该是 referrer,感兴趣可以看这篇:Referrer 还是 Referer?

目录
相关文章
|
存储 数据采集 数据挖掘
开源的Python科学计算库:NumPy
开源的Python科学计算库:NumPy
731 1
开源的Python科学计算库:NumPy
|
JavaScript 前端开发 搜索推荐
|
数据安全/隐私保护 Docker 容器
【Docker】使用docker安装部署NextCloud私人网盘
【Docker】使用docker安装部署NextCloud私人网盘
4799 0
【Docker】使用docker安装部署NextCloud私人网盘
|
Docker 容器 数据格式
Docker 修改镜像源地址
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80417198 我的Docker 版本为 1.
42800 0
|
网络协议 小程序 对象存储
阿里云加了防盗链,小程序白名单如何填写
一、场景 场景一:我的阿里云服务器,做了图片连接的防盗链,需要添加域名白名单图片才可显示出来 场景二:我们的使用场景是这样的,DNS解析至阿里云的CND,CDN的回源指向阿里云的OSS
1360 1
|
前端开发 JavaScript UED
React 图标库使用指南
本文详细介绍如何在 React 项目中使用 `react-icons` 等图标库,涵盖环境搭建、基础使用、常见问题与易错点、高级用法等内容,并通过代码案例进行说明。适合初学者和进阶开发者参考。
980 8
|
网络协议 安全
深入了解传输控制协议(TCP)
【8月更文挑战第24天】
639 0
|
11月前
|
人工智能 安全 程序员
一文彻底搞清楚HarmonyOS元服务
本文介绍Harmony OS的元服务,这是一种轻量级应用程序形态,具备秒开直达、纯净清爽、服务相伴、即用即走等特性,支持多设备运行,提升服务获取效率。元服务开发流程包括创建项目、UI开发、真机调试、打包测试及上架发布。欢迎关注,一起成长!
3357 0
|
JavaScript 应用服务中间件 网络安全
referrer防盗链
referrer防盗链
539 1
|
数据采集 开发者 Python
使用urllib和BeautifulSoup解析网页中的视频链接
使用urllib和BeautifulSoup解析网页中的视频链接