防盗链原理


何为防盗链

防盗链是一种用于保护站点内容的技术,通常用于防止其它网站在未经授权的情况下使用本站链接或者嵌入本站内容。图片、视频、音频等资源是最常见的会做防盗链处理的资源。因为这些资源的传输会占用比较大的带宽资源,一是会拖慢源站速度,二是增加源站的带宽负担却不给源站带来任何访问或点击。为了避免这种资源盗用的行为,许多网站都会做防盗链处理,阻止薅羊毛保护自己资源的安全。

例如本站的文章图床就是B站,白嫖B站嘿嘿。右击鼠标,审查文章图片元素,我们可以看见图片链接来自B站。代码大概如下

<img src="http://article.biliimg.com/bfs/article/cab8d12175592664b2e18008c81b0e47681f46fd.jpg">

image-20230325220138555

防盗链的技术手段

防盗链基本都是在服务端做处理的。**当客户端请求资源时,服务器根据客户端请求中携带的某种约定好的标识来确定请求来自我们授权过资源的站点。**目前较为普遍采用的就是HTTP请求头中的referrer来判断请求来源。也有其它的方案来进行防盗链处理如:

Token 防盗链

通过设置 Token 密钥,配合签名过期时间来控制资源内容的访问时限。Token 防盗链采用 md5 算法,将密钥、过期时间、文件路径等信息所计算的 md5 值加入到 URL 中,当客户端在验证请求时,除了验证过期时间,同时还会验证该 md5 值是否匹配,对于不匹配的 md5,说明 URL 被篡改,即使请求未过期也会禁止服务。

User-Agent 防盗链

每一个客户端都拥有自己的专属 User-Agent,我们可以抓包请求头查询到 User-Agent ,然后将自己的 User-Agent 加入白名单,或者将其他想要禁止的客户端 User-Agent 加入黑名单,从而保证用户只从自己允许的客户端下载内容。

防盗链的方法有很多,但是基本逻辑都是一样的。其关键点在于如何鉴别请求资源的客户端的身份,鉴权成功就返回资源。

破解防盗链

有了上面明确的基本思考方向,那么破解防盗链的方法也就有头绪。**既然防盗链的关键是身份识别,那么我们想办法绕过身份识别不就可以了。**下面介绍一种现在最常用的referrer防盗链方法的破解。

referrer防盗链是利用HTTP请求头里的referrer参数来进行客户端身份识别的,服务器可以设置校验这个字段信息。通常服务器的设置是有这个字段信息则进行校验,没有referrer字段则默认通过校验。即不强制校验referrer字段。利用这个特性我们可以将我们请求中的referrer去掉以达到破解防盗链的效果。

Referrer-Policy

Referrer-Policy是HTTP请求头部的一个字段,它用于表示该次请求使用的referrer策略。

image-20230325223458311

它有以下几种值:

Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url

关于字段的具体解释,点击这里查看。

使用meta标签设定文档的Referrer-Policy

在网页的头部设置meta标签可以指定整个文档的资源请求referrer策略。例如设置资源请求不携带referrer

<meta name="referrer" content="no-referrer">

关于meta标签的更多用法,点击这里查看。

需要注意的是使用meta标签设定文档的 referrer 策略,在css样式中并不生效。什么意思,看下面代码:

<html>
    <head>
        <meta name="referrer" content="no-referrer">
    </head>
    <body>
        <div
            style="background-image: url('http://article.biliimg.com/bfs/article/cab8d12175592664b2e18008c81b0e47681f46fd.jpg');">
        </div>
    </body>
</html>

按理来说我们给文档设置了referrer策略为no-referrer,图片请求的HTTP头不应携带referrer头部,但是实际上它还是会携带referrer。也就是说如果我们在css样式中引用了有防盗链保护的资源,那么它将不会被meta标签设定的referrer策略影响。

单独给某个元素标签的请求设定Referrer-Policy

在元素上将 rel 属性设置为 noreferrer。例如:

<a href="http://example.com" rel="noreferrer">

不过该方法只适用于特定的几个标签,其它的标签不支持rel属性。支持rel属性的标签有:<a><area><link>

还有一些元素标签支持使用referrerpolicy属性,为其单独设置Referrer-Policy策略。例如:

<a href="http://example.com" referrerpolicy="origin">

支持referrerpolicy属性的标签有:<a><area><link><script><iframe><img>