防盗链

2022-04-15 16:35:36 浏览数 (1)

今天学写imooc-reader的时候

又踩了一个坑,怎么说呢,既是个坑也不算是坑

算是新知识吧

复盘一下过程:

在我的页面中我用了一张网络图片,

如图:

就是很简单的一张网络图片

然后启动tomcat正常访问该网页

对吧

很奇怪的报错

403

如果找不到的话应该报404

可以看到浏览器的控制台给出了一个403的报错

而且还有一个

Referrer Policy:

strict-origin-when-cross-origin

这个东西

看到这个不禁回想起跨域,可是我想了想

以前说过img标签是自动配置好了跨域的

那我就直接去访问一下那个图片的url吧

然后就是这个样子的

哎很奇怪的就是 直接访问地址可以成功访问到图片

但是这又好像是个重定向

因为状态码是304

我我我真是百思不得其姐

然后就是一顿asking debug

问了很多群里的大佬们

和各位javaer们

最后得出的结论是

这是一个防盗链

那什么是防盗链呢

这里引用这位老师的;

网站资源都有域的概念,浏览器加载一个站点时,首先加载这个站点的首页,一般是index.html或者index.php等。页面加载,如果仅仅是加载一个index.html页面,那么该页面里面只有文本,最终浏览器只能呈现一个文本页面。丰富的多媒体信息无法在站点上面展现。

那么我们看到的各类元素丰富的网页是如何在浏览器端生成并呈现的?其实,index.html在被解析时,浏览器会识别页面源码中的img,script等标签,标签内部一般会有src属性,src属性一般是一个绝对的URL地址或者相对本域的地址。浏览器会识别各种情况,并最终得到该资源的唯一地址,加载该资源。具体的加载过程就是对该资源的URL发起一个获取数据的请求,也就是GET请求。各种丰富的资源组成整个页面,浏览器按照html语法指定的格式排列获取到各类资源,最终呈现一个完整的页面。因此一个网页是由很多次请求,获取众多资源形成的,整个浏览器在一次网页呈现中会有很多次GET请求获取各个标签下的src资源。

上诉例子中,作者提交了一张网站请求的图片,一个是本站的43.242段的IP地址,这是本站的空间地址,即向本站自身请求资源,一般来说这个是必须的,访问资源由自身托管。另外一类是访问182的网段拉取数据。这类数据不是托管站内的,是在其他站点的。浏览器在页面呈现的过程,拉取非本站的资源,这就称“盗链”。

准确的说,只有某些时候,这种跨站访问资源,才被称为盗链。假设B站点作为一个商业网站,有很多自主版权的图片,自身展示用于商业目的。而A站点,希望在自己的网站上面也展示这些图片,直接使用:

代码语言:javascript复制
<img src="http://b.com/photo.jpg"/>

这样,大量的客户端在访问A站点时,实际上消耗了B站点的流量,而A站点却从中达成商业目的。从而不劳而获。这样的A站点着实令B站点不快的。如何禁止此类问题呢?

HTTP协议和标准的浏览器对于解决这个问题提供便利,浏览器在加载非本站的资源时,会增加一个头域,头域名字固定为:

代码语言:javascript复制
Referer:

这个referer标签正是为了告诉请求响应者(被拉取资源的服务端),本次请求的引用页是谁,资源提供端可以分析这个引用者是否“友好”,是否允许其“引用”,对于不允许访问的引用者,可以不提供图片,这样访问者在页面上就只能看到一个图片无法加载的浏览器默认占位的警告图片,甚至服务端可以返回一个默认的提醒勿盗链的提示图片。

一般的站点或者静态资源托管站点都提供防盗链的设置,也就是让服务端识别指定的Referer,在服务端接收到请求时,通过匹配referer头域与配置,对于指定放行,对于其他referer视为盗链。

所以我这个图片的使用,估计是被视为了盗链,所以才会访问不通,那没办法,只能上cos存储了。

每天一个小知识

bingo

0 人点赞