让我们来看看图片防盗链各大厂做的怎么样!

让我们来看看图片防盗链各大厂做的怎么样!

2026-02-01
今天突发奇想就像试试抓抓各大厂的头像接口,没想到有挺多根本没有防盗链

这是什么?

只是随便搜集的一些头像接口,全部来自于我手机里目前安装的大部分APP服务。其中无 Web 标识的头像,如果你能看得见,那么证明该服务商并没有做严格的SSL校验,导致逆向极其简单。无该标识的默认为移动APP。以下所有资源均来自我个人使用的账号

一些小发现

头像描述
QQ
OPPO(Web)
Google(Web)
小米(Web)
京东(Web)
高德地图(Web)
美团
淘宝
拼多多
GitHub(Web)
Telegram(Web)
WPS(Web)
闲鱼
好游快爆
网易云音乐(Web)
KOOK
TapTap(Web)
(微信)公众号助手
百度网盘
Steam(Web)

这表明了什么?

对于图片,音乐,影片等静态资源,若直接使用 img audio video 等标签,无需CORS即可将远端资源在任意网页上展示。这是W3C规范的一部分,详情请参考 HTML5 嵌入内容

当然,如果您是一个网站的维护者,您可能不想让陌生人直接将你的资源展示给别人看,或者怕被刷出账单,下面我将简单说明哪些措施是有效的,哪些是掩耳盗铃

首先我们来分辨一下您手动做服务端的防盗链和浏览器CORS的区别:

浏览器CORS是客户端行为,当某个行为被对端CORS策略拒绝,浏览器会阻止响应体。而服务端防盗链是在您的后端上编写一些小脚本,用以拒绝非法访问。前者会在用户浏览器弹出CORS错误,而后者会在用户浏览器显示错误状态码,如500,401,403,这取决于您的实现

是否可以尝试设置Referer白名单来拒绝非法访问? 没用 因为Referer在浏览器中是可以伪造或者不发送的。详见 HTML 5 引用来源策略

您应该做的事情稍微有些复杂,如将API放到Cookie(登录,非游客权限)中,并且让后端处理Cookie的发放与吊销。就像微软那样

又或者说,您只想要用户仅能通过浏览器单独查看图片,而不让 任何人(包括您) 引用图片到网站中,您可以使用 Accept 请求头 白名单,您可以尝试比较一下这两个 Accept 请求头 ,前者是直接访问图片浏览器自动发送的,而后者是引用时发送的

text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8

最后,如果您想做到图片必须是 游客访问 ,又不想让他人滥用。可以使用CORP(Cross-Origin-Resource-Policy)

只需要在别人拉取图片时返回一个CORP响应头,如: Cross-Origin-Resource-Policy: same-origin

另外,CORP不仅能保护图片,它可以保护一切东西,下面是一个简单的示意图 浏览器拉取资源 -> 请求资源,检查响应头 -> CORP(给不给用,默认给用) -> CORS(给不给JS读,默认不给) -> 返回

当CORP响应头返回的策略中和将要拉取资源的源不匹配,浏览器会阻止资源在页面加载,但并不会阻断原始请求

描述
same-origin同源。仅允许 example.com 拉取对应资源
same-site同站。仅允许 *.example.com example.com 拉取资源
cross-origin默认值。允许所有源,任何人都可以拉取

设置后跨站引用会被浏览器阻止

另外提一嘴,Chromium 最近推了一个更新,导致CORS/CORP错误默认不显示在控制台,需要勾选 显示控制台中的CORS错误 控制台功能参考  |  Chrome DevTools  |  Chrome for Developers