当前位置: 首页 > news >正文

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?

http://www.lryc.cn/news/160632.html

相关文章:

  • App自动化测试持续集成效率提高50%
  • LeetCode —— 复写零(双指针)
  • 【Vue篇】Vue 项目下载、介绍(详细版)
  • Python批处理(一)提取txt中数据存入excel
  • 只考一门数据结构!安徽工程大学计算机考研
  • Ubuntu 20.04出现蓝牙无法打开的问题(已解决)
  • 并发测试工具 apache-jmeter使用发送post请求JSON数据
  • 牛客练习赛115 A Mountain sequence
  • 通过git bash激活虚拟环境遇到的问题
  • EasyAVFilter代码示例之将摄像机RTSP流转成RTMP推流输出
  • 【【C语言康复训练-4】】
  • [DM8] DM-DM DBLINK DPI方式
  • 创建了一个名为nums_list的vector容器,其中存储了一系列的pair<int, int>
  • SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置
  • Leetcode143. 重排链表
  • Git 回顾小结
  • 响应式布局(3种) + flex计算
  • Pytorch从零开始实战01
  • inappropriate address 127.0.0.1 for the fudge command, line ignored 时间同步的时候报错
  • linux并发服务器 —— 项目实战(九)
  • 生信教程|替代模型选择
  • redis持久化、主从和哨兵架构
  • Python 连接 Oracle 详解
  • 认识模块化
  • 2023年及以后语言、视觉和生成模型的发展和展望
  • OpenLdap +PhpLdapAdmin + Grafana docker-compose部署安装
  • Java | 排序内容大总结
  • Go 语言入门指南:基础语法和常用特性解析
  • 20.添加HTTP模块
  • Qemu 架构 硬件模拟器