热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

你知道资源防盗链是如何实现的吗?

为什么要搞个防盗链,难道怕自行车被偷吗?现在知识都共享了,还担心什么数据被别人使用吗!防盗链,就是防你盗用我的

为什么要搞个防盗链,难道怕自行车被偷吗?现在知识都共享了,还担心什么数据被别人使用吗!

防盗链,就是防你盗用我的链接。你在你的网站上引用了我的资源(图片,音频),你跑起来倒是没什么事,但是会浪费我的流量,资源被引用的多了起来,我这边的服务器可能就扛不住挂了,你说这是多么悲哀的事情!

一般情况下以图片防盗链居多,我们也来看看图片防盗链是如何做出来的。

图片防盗链:先来看个图,这个图是我在本地启了一个服务后,分别加载了百度和360搜索两个网站的图片链接,对应防盗链下的样子(说好的美少女呢)

640?wx_fmt=jpeg

百度的做法是用另外一张图片替换了,而360搜索的做法更粗暴,直接出现了裂图,访问403直接给Forbidden了。这就是所谓的图片防盗链了,毕竟看到这样的图,大家也没了兴致,和之前想要的图片差距太大,也就没必要再保留了

那么关键部分来了,图片防盗链是如何做到的呢?且看下图

640?wx_fmt=jpeg

图中所示,在请求头中有Host(请求的主机)和Referer(来源)两个参数,之所以会形成防盗链,那是因为Host和referer所对应的值不相同造成的。

下面我们就直接来实践一下,做一个图片防盗链,具体例子如下:

640?wx_fmt=jpeg

该图为整个文件夹目录结构,下面参考该目录结构来做(注意看代码中的注释哦)

// js部分
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const getHostName = function (str) { let { hostname } = url.parse(str); return hostname;
};
http.createServer((req, res) => { let refer = req.headers['referer'] || req.headers['referrer']; // 请求头都是小写的 // 先看一下refer的值,去和host的值作对比,不相等就需要防盗链了 // 要读取文件 返回给客户端 let { pathname } = url.parse(req.url); let src = path.join(__dirname, 'public', '.' + pathname); // src代表我要找的文件 fs.stat(src, err => { // 先判断文件存不存在 if (!err) { if (refer) { // 不是所有图片都有来源 let referHost = getHostName(refer); let host = req.headers['host'].split(':')[0]; if (referHost !== host) { // 防盗链 fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res); } else { // 正常显示,如果路径存在,可以正常显示直接返回 fs.createReadStream(src).pipe(res); } } else { // 正常显示,如果路径存在,可以正常显示直接返回 fs.createReadStream(src).pipe(res); } } else { res.end('end'); } }); }).listen(8888);

通过以上不到40行的代码就完成了图片防盗链,想来也并没有辣么麻烦,利用请求头来做的事情还是蛮多的,先来看看防盗链的效果吧

<-- html部分 -->

这里我们修改一下hosts文件&#xff0c;把127.0.0.1指定为两个不同的域名访问

  1. 127.0.0.1 www.chenhd.me

  2. 127.0.0.1 www.chd.me

友情提示&#xff1a;

  • windows 系统修改 hosts 文件地址为 C:\Windos\System32\drivers\etc下的hosts文件&#xff0c;拷贝hosts文件修改后替换即可

  • mac 系统下较为方便通过终端直接 sudo vi /etc/hosts修改即可

由于 html 部分我们图片引用的地址就是 www.chenhd.me 域名下的图片&#xff0c;所以这种情况属于正常访问&#xff0c;直接展示 2.png 图片了&#xff0c;就是这么酷

640?wx_fmt&#61;jpeg

当修改域名为www.chd.me的时候&#xff0c;再次访问就发现已经替换为防盗链图片1.jpg了&#xff0c;看如下效果

640?wx_fmt&#61;jpeg

以上内容就实现了如何做一个图片防盗链&#xff0c;防止别人使用你的资源&#xff0c;当然不仅仅是图片防盗链&#xff0c;音频&#xff0c;视频等也可以根据此方法实现&#xff0c;之后大家也可以在工作中尝试尝试。

文章来源:

chenhongdong https://juejin.im/post/5adc0d03518825673a2022b7

640?wx_fmt&#61;png

交流学习

大家好&#xff0c;我是koala&#xff0c;公众号「程序员成长指北」作者。公众号为您打造优质学习路线&#xff0c;并且会推送超级优质文章。加入我们一起学习吧&#xff01;公众号对应博客地址&#xff1a;https://github.com/koala-coding/goodBlog


推荐阅读
  • 360搜索引擎取真实地址python代码
    还是个比较简单的,不像百度有加密算法http:www.so.comlink?urlhttp%3A%2F%2Fedu.sd.chinamobile.com%2Findex%2Fnew ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 百度站长HTML添加301错误,网站设置重定向301跳转后常见问题汇总解答
    很多朋友经常在qq上问我网站设置重定向301的问题,因为有工作繁忙,当时解答的并不是很细致,这几天闲来无事,把朋友问的关于3 ... [详细]
  • #爬取京东urltry:rrequests.get(url)r.raise_for_status()r.encodingr.apparent_encodingprint(r.t ... [详细]
  • 搜索引擎各大站长平台汇总(盘点)
    百度搜索占比67.09%,神马搜索占比6.84%,搜狗搜索占比18.75%,其他搜索占比2.08%,谷歌搜索占比2.57%,必应搜索占比2.6%站长平台是搜索引擎官方提供的的辅助网 ... [详细]
  • 工具说明书搜索引擎推荐
    Yandex俄罗斯人用的多。YetAnotherIndexer(另一个索引)。把定位改到美国,再把搜索设置为无限制。www.yan ... [详细]
  • google无法访问 2014解决方法详解
    目前像大家常访问的google.com以及google.com.hk均无法正常访问,另外包括GMAIL邮箱也是如此,并且有大量网友遇到此问题,小编针对此问题做了小研究,为了各位小伙伴可以顺利打开谷歌搜 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 使用PythonRequests伪装成浏览器请求百度360获取关键词批量排名#!usrlocalpythonbinpython3.7importrequests,re,time,r ... [详细]
author-avatar
紫陌
这个世界上真的有天使的存在吗
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有