Node核心模块Http应用-防盗链

news/2024/7/18 4:47:01

防盗链的原理是通过判断请求源地址的req的headers里面的host和referer进行判断,如果两个相等证明是同一个源下返回正确图片,不相同返回错误图片。

    let fs = require('fs');
    let path = require('path');
    let url = require('url');
    let http = require('http');
    let whiteList = [
      'localhost:3000'
    ]
    http.createServer((req,res)=>{
      let {pathname} = url.parse(req.url,true);
      if(pathname === '/'){
       return fs.createReadStream(path.join(__dirname,'index.html')).pipe(res);
      }
      let realPath = path.join(__dirname,pathname);
      let referer = req.headers['referer'];  // referer
      fs.stat(realPath,function (err,statObj) {
        if(err){
          return res.statusCode = 404 ,res.end();
        }else{
          if (referer){ // 要校验一下 引用的来源
            // 需要获取图片的referer
            let r = url.parse(referer).host; // 来源的主机
            // 取到当前图片的主机 
            let h = req.headers['host']; // 当前图片自身的域名来源
            if (r === h  ||  whiteList.includes(r)){
              fs.createReadStream(path.join(__dirname, '1.jpg')).pipe(res);
            }else{
              fs.createReadStream(path.join(__dirname, '2.jpg')).pipe(res);
            }
          }else{
            fs.createReadStream(path.join(__dirname, '1.jpg')).pipe(res);
          }
        }
      })
    }).listen(3000);

复制代码

http://www.niftyadmin.cn/n/1665935.html

相关文章

web 自动化测试,一定得掌握的 8 个核心知识点

使用 cypress 进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用 JavaScript 作为编程语言。传统主流的 selenium 框架是支持多语言的,大多数 QA 会的 python 和 Java 语言都可以编写 selenium 代码,遇到需要编写 js 代…

memset函数使用方法

将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值&#xff0c; 块的大小由第三个参数指定&#xff0c;这个函数通常为新申请的内存做初始化工作&#xff0c; 其返回值为指向S的指针。 需要的头文件在C中 <string.h>在C中 <cstring>更详细的解说…

JavaScript 九种跨域方式实现原理

前言 前后端数据交互经常会碰到请求跨域&#xff0c;什么是跨域&#xff0c;以及有哪几种跨域方式&#xff0c;这是本文要探讨的内容。 一、什么是跨域&#xff1f; 1.什么是同源策略及其限制内容&#xff1f; 同源策略是一种约定&#xff0c;它是浏览器最核心也最基本的安全功…

《深入理解计算机系统》笔记-信息的表示和处理

记录&#xff1a;如何缩放csdn中的图片&#xff1a;在#pic_center末尾加上50%x50%&#xff1b;#pic_left&#xff1a;左对齐。 视频地址&#xff1a;https://www.bilibili.com/video/BV1kE411X7S5?p16&spm_id_frompageDriver 文章目录二、信息的表示和处理1. 信息存储1.1…

Python爬虫使用代理IP的实现

使用爬虫时&#xff0c;如果目标网站对访问的速度或次数要求较高&#xff0c;那么你的 IP 就很容易被封掉&#xff0c;也就意味着在一段时间内无法再进行下一步的工作。这时候代理 IP 能够给我们带来很大的便利&#xff0c;不管网站怎么封&#xff0c;只要能找到一个新的代理 I…

Jenkins使用教程

Jenkins使用教程 Jenkins 是一款流行的开源持续集成&#xff08;Continuous Integration&#xff09;工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。本文以 CentOS7 环境为例&#xff0c;总结了 Jenkins 的安装与配置、邮件功能使用&#xf…

如何写出高效的软件测试用例?微信朋友圈动态发送为例

编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持。 但这并不意味着&#xff0c;没测试经验、分析能力弱就不能写好用例&#xff0c;还是有方法可循的。作为混迹测试职场 10 年的老人&#xff0c;给大家分享一些用例编写的心得&#xff0c;接下来我会从…

模块初识import sys---- sys.argv--- import os---- os.system(df -h)

模块分2种&#xff0c;也叫库 1、标准库&#xff0c;直接导入import就可以用 2、第三方库&#xff0c;必须先安装再导入import才能使用 import sys print(sys.path) #打印环境变量 这边有一个注意事项&#xff0c;如果你import的库的名字&#xff0c;跟你文件本身的名字一样的话…