MENU

新浪图床防盗链始末

2020 年 02 月 19 日 • 阅读: 20149 • 博客

新浪图床加防盗链检测已经是很久以前的事了,那时我还在用静态博客,虽然也中了招,但只有几篇帖子,影响不大。但今天有博友留言仍未解决,希望有办法暂时恢复图片显示,慢慢迁移,所有我就借花仙佛,总结一下已有的快速恢复和迁移方法。

可忽略内容

问题发生后,万能网友很快发现,空 referrer 头仍能获取图片,这说明新浪未做强防盗链检测。已有机制是校验 HTTP 协议头的 referrer 字段,即来源验证。具体来说,假如你的帖子 http://blog.xx.com/123.html 引用了一张新浪图片,浏览器向服务器请求该图片时,会把 referrer=http://blog.xx.com/123.html 一并发送过去,新浪检查到非官方来源便返回了 403 禁止访问。如果强制发送 referrer= 或不发送该字段,服务器仍正常返回,所以就有了以下各种 no-referrer 配置。

前端

META

方式一,在每个页面的 head 部分添加 meta 标签,会导致站点评论、统计等功能失效,因为它们同样依赖来源。

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

IMG

方式二,给每张图片单独配置 referrer 策略,不兼容 IE、Edge 和 Safari on iOS。

<img src="demo.jpg" referrerpolicy="no-referrer">

IFRAME

方式三,将图片放到 iframe,每张图片都写这么多代码,没人有耐心,且有相同的兼容性问题。

<script>
    function iframeLoaded(target) {
        var img = target.contentDocument.images[0];
        target.width = img.width;
        target.height = img.height;
    }
    window.sina = '<img src="//wx4.sinaimg.cn/large/007iuyE8gy1g2g8p3ovr3j30t314lhdt.jpg">';
</script>
<iframe 
    referrerpolicy="no-referrer"
    src="javascript:parent.sina"
    scrolling="no"
    frameborder="0"
    onload="iframeLoaded(this)">
</iframe>

后端

Referrer-Policy

方式四,通过 NgnixApache 等 Web 服务器,直接告诉浏览器 Referrer-Policy: no-referrer,效果同方式一,意味着有相同的副作用。

Nginx

add_header Referrer-Policy no-referrer;

Apache

Header always set Referrer-Policy "no-referrer"

反向代理

方式五,反代,让后端构造任意 referrer,如 referrer=https://m.weibo.cn 获取图片,转发给前端,这样前端就无需任何配置,也就不会产生副作用。

可以用自己的 服务器CDNCloudflare 等搭建反代,也可使用如下第三方代理。

<!-- 新浪官方未加验证域名 -->
<img src="//tva1.sinaimg.cn/large/007iuyE8gy1g2g8p3ovr3j30t314lhdt.jpg">

<!-- Wordpress 官方反代 -->
<img src="//i0.wp.com/wx4.sinaimg.cn/large/007iuyE8gy1g2g8p3ovr3j30t314lhdt.jpg">

<!-- 百度图片搜索反代 -->
<img src="//image.baidu.com/search/down?tn=download&url=https://wx4.sinaimg.cn/large/007iuyE8gy1g2g8p3ovr3j30t314lhdt.jpg">

替换链接

有了反代服务器后就要把站点所有新浪图片都替换成反代链接。

服务器替换

可通过 NginxApache 插件实时检查。我没有动力详细介绍,读者可参考 Nginx 内容替换模块 http_substitutions_filter_module 实用案例分享使用 mod_ext_filter 组件在 Apache 中实现输出内容的替换,为所有页面增加统计功能

下面是 ngx_http_substitutions_filter_module 的配置示例,这个模块要自行编译安装。

sub_filter '[0-9a-z]{3}.sinaimg.cn/large/' 'i0.wp.com/wx4.sinaimg.cn/large/' ir;

数据库替换

如果不熟悉 Nginx 编译安装,可以使用数据库替换的方法,Typecho 参考 Typecho 网站域名更换方法,Wordpress 参考 WordPress 迁移站点更换域名为新域名的 N 种方法。注意备份数据库,执行命令时仔细甄别表名,字段名,不可无脑操作。

浏览器替换

如果以上内容都不熟悉,可直接使用 JS 代码在浏览器替换。对于 本主题,依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将代码加入到 自定义 HTML 元素拓展 - 标签: head 头部 (meta 元素后)。其他主题,加入到主题对应的 header.php 中的 </head> 标签前。

<script>
    // 临时替换新浪图床为反代链接
    document.addEventListener('DOMContentLoaded', initSinaProxy);
    function initSinaProxy() {
        var sinaImgs = document.querySelectorAll('img[src*="sinaimg.cn"]');
        for (var i = 0; i < sinaImgs.length; i++) {
            var img = sinaImgs[i];
            img.src = '//tva1.sinaimg.cn/large/' + img.src.split('/').pop();
        }
    }
</script>

如果你开启了 PJAX,可能需要单独加入回调函数。对于本主题,依次进入 控制台 - 外观 - 设置外观 - PJAX(BETA) - PJAX RELOAD,将 initSinaProxy(); 添加进入即可。

迁移

前面说了这么多 Linux 操作,还是挺麻烦的,关键是我没有动力详细写,如有困难可留言,我宁愿直接操作服务器。TypechoWordpress 用户可使用链接中的迁移工具简化操作。

最后,今后一定要将所有图片放到自己的 CDN,同时在其他地方按文章名称建立备份文件夹,以防数据丢失。

TG 大佬群 QQ 大佬群

最后编辑于: 2020 年 02 月 24 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

Loading captcha...

已有 22 条评论
  1. 于长野 于长野   Android 10  WebView 4.0

    以前图站就是用的新浪图床,后来有一阵子链接不断失效,https不能用了,ws开头的域名图片失效,手动改成wx开头子域名还能用,https://picture.rabithua.club/index.php/archives/131/
    刚刚看了看还在~
    不过我是真的怕了,后来的图片都放腾讯云cos了,最后,腾讯云cos免费额度真香!::quyin:1huaji::

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @于长野优秀,以后壁纸从大佬这拿了@(捂嘴笑)

  2. 啊立 啊立   Windows 10 x64 Edition  Google Chrome 80.0.3987.122

    大佬,你博客的商店的支付下单页面是怎么做的呀,有啥第三方提供源码的吗@(滑稽)

  3. 梁生 梁生   Windows 10 x64 Edition  Google Chrome 78.0.3904.70

    您好,仔细看了你的文章。我的站点是wordpress博客,微博图片很多,目前用的第二种方式做成JS代码放在页面底部。
    看了你的介绍后,我把你的代码放在页面头部head部分,测试对IE浏览器有效。但是目前有个麻烦,换成这段代码后wordpress文章列表的缩略图不显示了,这是怎么回事?
    您知道怎么解决吗?可以有偿发红包...

    1. LOGI LOGI   Android 9  Google Chrome 80.0.3987.117

      @梁生加文末群组找我

  4. 梁生 梁生   Windows 10 x64 Edition  Google Chrome 78.0.3904.70

    您好,仔细看了你的文章。我的站点是wordpress博客,微博图片很多,目前用的第二种方式做成JS代码放在页面底部。
    看了你的介绍后,我把你的代码放在页面头部head部分,测试对IE浏览器有效。但是目前有个麻烦,换成这段代码后wordpress文章列表的缩略图不显示了,这是怎么回事?
    您知道怎么解决吗?可以有偿发红包...

  5. sora sora   iOS 13.3.1  Safari 13.0.1

    这一篇文章被百度抓取了,而我的垃圾站谷歌抓爆了,百度都不鸟我@(小乖)

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @sora得手动提交,它还不一定接受,主要靠互访

    2. sora sora   iOS 13.3.1  Safari 13.0.5

      @LOGI那还是不管他了,顺便问一下,博客收到回复发邮件怎么弄的::quyin:1huaji::

    3. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @sorahttps://logi.im/blog/comment-to-email.html

  6. 团子 团子   Windows 10 x64 Edition  QQ 浏览器 10.5.3863.400

    不容易啊终于有cdn速度快一截@(哈哈)

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @团子是吗@(哈哈)

  7. 初夏阳光 初夏阳光   Windows 10 x64 Edition  Google Chrome 79.0.3945.130

    说得好,我选择放在阿里OSS。香香香@(真棒)

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @初夏阳光#(赞一个)

  8. 小童 小童   Windows 10 x64 Edition  Google Chrome 79.0.3945.130

    大佬太棒了,我在网上找寻到方式一和方式四奈何太小白完全不懂代码怎么加,辛亏有最后一种方式简单直接,已经成功啦@(玫瑰)

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @小童很高兴能帮到你@(吐舌)

  9. 未央花 未央花   Windows 10 x64 Edition  QQ 浏览器 10.5.3863.400

    老哥,就是你文章末尾,那4个类似标签是怎么弄得?::quyin:doubt::

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @未央花写文章的时候,右侧有添加标签呀::quyin:witty::

    2. 未央花 未央花   Windows 10 x64 Edition  QQ 浏览器 10.5.3863.400

      @LOGI::quyin:hematemesis::才入坑,用的少,竟然没注意这个的用途。谢啦::quyin:feizao::

  10. Dan Dan   Windows 10 x64 Edition  QQ 浏览器 10.5.3751.400

    那个微软的网盘 还能免费扩容么?@(太开心)

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.116

      @Dan管理员可以

  11. 小童 小童   Windows 10 x64 Edition  Google Chrome 79.0.3945.130

    感谢大佬,我仔细琢磨琢磨试试~@(爱心)