本文讲述了防盗链的原理和实现方法。

防盗链原理

图片盗链 是指在网页内未经允许直接使用他人网站上的图片资源。

图片服务器在接收到图片资源请求时,会先判断请求源地址是否是授信任的地址,是的话返回图片资源,否则禁止访问或者返回防盗链图片。

具体实现以 baidu 网站为例,发起图片地址请求时会在头部Referer加上请求源https://www.baidu.com/,图片服务器通过此字段识别访问来源。如下图:

图片请求示例图

Referer HTTP 请求头部中的一个字段,包含了请求的来源页面的 URL。通过检查 Referer 头部的值,可以判断请求的来源页面。

防盗链

nginx 配置

server {
    listen 80;
    server_name your_domain.com;  # 你的域名

    location ~* \.(jpg|jpeg|png|gif|css|js)$ {
        valid_referers none blocked your_domain.com *.your_domain.com;  # 允许的域名列表
        if ($invalid_referer) {
            return 403;  # 如果 Referer 无效,返回 403 错误
            #rewrite ^/ http://www.xxx.com/403.jpg;  # 或者返回防盗链图片
        }

        # ... 其他配置 ...
    }

    # ... 其他服务器配置 ...
}

反防盗链

  1. 网站是https协议的,而盗用图片资源是http协议。则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。
  2. 使用 wsrv.nl : 假设你的图片地址是:https://wsrv.nl/lichtenstein.jpg
# html 中使用
<img src="//wsrv.nl/?url=wsrv.nl/lichtenstein.jpg">

# Markdown 中使用
![](https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg)
  1. 使用服务端伪造请求头部