图片防盗链最终解决方案(附详细使用和评测)

发布于 2023-07-26  2.12k 次阅读


本文于 2023年9月2日 2:37 更新,注意查看最新内容

前言

这两年博客文章的图片一直使用的 QQ 空间作为外链,去年一年没管,今年一看发现发现图片全挂了(防盗链)。

想着当初找了挺久的图床,以为不出意外大概能用个十多年,毕竟往推前十年,这个图床一直都没有问题,而且据我了解,知道这个渠道的人并不是很多。

但既然现在已经开了防盗链,也就只能去找相应的解决方案,碰巧当时正值新浪图床大规模开启防盗链,于是打算学习一下其他站长解决方案来解决自己博客的问题。

这一拖,便到这个月,在参考了《2023 年微博图床 403 全失效,一个方法秒解决! - 奔跑中的奶酪》之后,被迫选择了 wsrv.nl 的图片缓存服务来解决博客的图床外链问题,但因为该服务使用是国外服务,在访问速度上总觉得差强人意。

今天不知道脑子抽了哪门疯,突然就想解决一下这个问题,于是便有了本文的由来。

原理

本文采取的解决方案是使用“图片缓存服务”来解决平台防盗链的问题,在讲具体原理之前,我们先了解一下防盗链的实现,常见的防盗链形式一般有插入图片链接不显示图片、插入图片链接显示统一防盗图片等(具体见下图),而图像存储平台判断图片是否本平台正常引用的条件为判断 HTTP 请求来源,再反馈相应的 HTTP 请求代码。

图片来源:奔跑的奶酪

什么是 HTTP 状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。

《菜鸟笔记 - HTTP 状态码》

HTTP 状态码一共分为 5 种类型:

100 - 客户端应继续其请求

200 - 请求成功

301 - 资源(网页等)被永久转移到其它URL

404 - 请求的资源(网页等)不存在

500 - 内部服务器错误

《菜鸟笔记 - HTTP 状态码》

图片来源:奔跑的奶酪

这里涉及到 HTTP 请求具体流程,就不过多展开,简单来说就是当我们网站请求图片地址后,平台会判断 HTTP 请求头中的 Referer 信息,也就是请求网站地址,如果不是平台白名单地址就拒绝请求,或在请求时直接以下载方式打来,而不允许浏览器直接显示该图像资源。

而图片缓存服务有可能是我们通过缓存平台直接请求了图像地址,而规避了直接请求图像地址时图像存储平台进行的相应操作。

解决

测试图片:https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png

本文测试图片存储平台为语雀,语雀官方不允许直接在浏览器中直接打开图片,而只能下载查看。

所以正常情况下,能使用该图片缓存服务在浏览器中正常显示语雀图片的,也能正常显示其他图像存储平台的图片。

搜狗图片

https://img02.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/q/95/crop/xy/ai/t/0/?appid=122&url=
https://img02.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/q/95/crop/xy/ai/t/0/?appid=122&url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png

Ping检测

评语

国内大厂,多节点,访问速度快,但接口可能不稳定,失效之后可从搜狗图片自行抓取


百度图片(仅支持新浪等)

https://image.baidu.com/search/down?url=
https://gimg2.baidu.com/image_search/&app=2020&src=图片地址
https://image.baidu.com/search/down?url=https://tvax4.sinaimg.cn/large/006BNqYCly1hfsl2jlg0oj30mj0fz0vp.jpg

使用:接口地址+图片地址

使用接口地址2时,图片地址要去掉 https://

域名信息

Ping检测

评语

国内大厂,多节点,访问速度快,但接口可能不稳定,且仅能微博图床无法在浏览器中直接打开


广西某讯

http://collect34.longsunhd.com/source/plugin/yzs1013_pldr/getimg.php?url=
http://collect34.longsunhd.com/source/plugin/yzs1013_pldr/getimg.php?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
域名信息

国内测速

评语

虽然是一家私企,但是感觉规模不小,且主要业务均是Dang{过滤}政一类的业务,且该接口最早被索引在2021年之前,较为稳定。


weserv.nl

https://images.weserv.nl/?url=
https://images.weserv.nl/?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png

使用:接口地址+图片地址(无请求头要求)

域名信息

Ping检测

评语

老牌图像缓存服务商,较为稳定,但速度一般。


noobzone

https://img.noobzone.ru/getimg.php?url=
https://img.noobzone.ru/getimg.php?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png

使用:接口地址+图片地址(无请求头要求)

域名信息

Ping检测

评语

俄罗斯的图片缓存服务,速度一般,建议不用。


WordPresss

i0.wp.com/ 
i1.wp.com/
i2.wp.com/
i3.wp.com/
http://i0.wp.com/cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png

使用:接口地址+图片地址

所有接口使用时,图片地址均要去掉请求头

域名信息

Ping检测

评语

WordPress 旗下图像缓存服务,速度较慢,可以备用。


其他备用

https://cdn.cdnjson.com/

CdnJson 提供的图像缓存服务,可以加速新浪微博/知乎等开启防盗链的图片,需要去掉 http/https 协议。

https://cors.zme.ink/

基于 Cloudflare Workers 搭建的跨域代理缓存服务,可以缓存所有内容,需要加 http/https 协议。

https://www.codenong.com/getimg_baidu.php?url=

说是香港的图片缓存服务,实际不清楚(套了 CDN),支持大部分的图片链接,必须加 http/https 协议。

SQL一键替换

UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://tvax1.sinaimg.cn/', 'https://image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/' )

注意:在操作前记得备份一下数据库,即使操作不当也能及时回滚。

参考


这短短的一生,我们最终都会失去。