当前位置: 首页 > 后端技术 > Node.js

用Referer方案写一个图片防盗链服务,实现网页“破解”

时间:2023-04-03 14:23:16 Node.js

什么是盗链资源不在自己服务器上,而是通过技术手段,把资源放到自己网站上,盗用别人通过这种方式Referer是什么?Referer是http请求头的一部分。当浏览器(或模拟浏览器行为)向web服务器发送请求时,header信息中包含Referer。表示当前接口的来源。Referer的正确英文拼写是referrer。由于早期http规范的拼写错误,为了保持向后兼容性,会出现错误。其他网络技术的规范试图纠正这个问题并使用正确的拼写,所以现在的拼写并不统一。为什么要设置防盗链爬虫如何设置防盗链安全(流量激增,服务商是受害者)这里有一个基于express二次开发框架nestjs的小demo可以使用token校验和其他实现更严格防盗链的方法...(如何添加路由等我就不说了,有兴趣的可以直接看我的代码,直接跳转到validator的路由代码)routers/doorChain/controller.tsimportexpressfrom'express';import{Get,Headers,Res,Controller}from'@nestjs/common';import{DoorChainService}from'./service';@Controller('door-chain')exportclassDoorChainController{constructor(privatereadonlydoorChainService:DoorChainService){}@Get()root(@Headers('referer')referer:string,@Res()res:express.Response){returnthis.doorChainService.root(referer,res);}}routers/doorChain/service.tsimport*asurlfrom'url';从'p导入*作为路径ath';从'express'导入快递;从'@nestjs/common'导入{Injectable};从'utils/logger'导入记录器;@Injectable()exportclassDoorChainService{root(referer:string,res:express.Response){让imageName='break.png';如果(!referer){imageName='yellow.png';}else{try{constrefererParsed=url.parse(referer);if(refererParsed.host==='localhost:8080'){imageName='yellow.png';}}catch(err){}}constimagePath=path.resolve(__dirname,`./../../assets/${imageName}`);res.sendFile(imagePath,null,err=>{if(err){logger.error(err);res.status(404).end();}else{logger.info(`Sent:${imagePath}`);}});}}主要逻辑代码也就那么几行!验证的基本思路:当referer为空时,返回正确的图片;当referer不为空且主机访问我的目标网站时,在refer时返回正确的图像r不为空,但是当主机打不上我的目标网站时,会返回一个错误的地图启动服务,访问http://localhost:3333/door-chain,返回正确的地图!!!如何解除访问限制这次我们只讨论如何解除网页的访问限制。另外还有七牛镜像存储,或者将执行方案交给服务器处理等,原理都是一样的,这里不再赘述。下面简单介绍去除header中的Referrer有两种方法:添加meta标签policyname属性值(MDN标准)属性值(whatwg标准)NoReferrerno-referrerneverNoReferrerWhenDowngradeno-referrer-when-downgradedefaultOriginOnlyorigin-OriginWhenCross-originorigin-when-crossorigin-UnsafeURLunsafe-urlalways无论选择哪个值,都有一个缺点,就是默认所有资源(包括接口)都处理过了。将ReferrerPolicy属性添加到标签中,以更精确地指定某个资源的引用策略。相对于上面的取值列表,ReferrerPolicy在此基础上扩展了三个可选值:同源的同源请求会发送引用地址,但对于非同源请求,引用地址信息不会被发送。strict-origin在相同安全级别的情况下,文件的来源作为参考地址发送(HTTPS->HTTPS),但在降级的情况下不会发送(HTTPS->HTTP)。strict-origin-when-cross-origin对于同源请求,将发送完整的URL作为参考地址;在安全级别相同的情况下,文件的来源将作为参考地址发送(HTTPS->HTTPS);在降级的情况下不要发送此标头(HTTPS->HTTP)。从纯粹的开发角度来看,这种方法已经接近完美,因为它不会污染其他任何东西。让我们看看浏览器兼容性:常规值的问题不是太大。新扩展三个值的兼容图不容乐观!关于扩展img标签属性,tsx中的img标签默认不支持referrerPolicy。实现方案可以参考ts-react-webpack看我是怎么扩展的。欢迎踩!!!当然,虽然常用,但大部分都会是类似上面的解决方案。总的来说,这只是防盗链知识体系中少见的一部分,还有待探索。另外还有referrer-killer等项目可以参考