新浪图床失效解决方案
前言
最近,新浪云对图床做了Referer防盗链验证,导致广大使用新浪当图床的博主的文章内的引用素材失效,无法显示,为此,我们可以经过中转或者伪装等方式来绕过Referer防盗链验证
Referer防盗链是什么
HTTP Referer是Header的一部分,当浏览器向web
服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
基于Referer我们就可以在服务端知道哪些是“友军”哪些是外链,从而达到过滤和节约服务器资源的目的。
我们的解决方案就是通过不发送referer的方式来访问,所以就需要伪装或者中转,话不多说,贴解决方案
解决方案
PHP文件中转
<?php
header('Content-type: image/jpeg');
echo file_get_contents(isset($_GET["url"])?$_GET["url"]:'');
原理:通过传入Url再输出来显示图片
优缺点:可以使用统计类组件,效率低,需要大批量更换链接
使用方法:建立一个PHP文件在某个服务器上
http(s)://你的域名/img.php?url=照片地址
使用实例:
<img src="https://your-domain-name/img.php?url=https://ws3.sinaimg.cn/large/006tNbRwly1fyq4yujgssj30jg0jgmxg.jpg" />
(已验证可用)
使用iframe
<script>window.sc="<img src='图片链接?"+Math.random()+"'>";</script>
<iframe id="imiframe" src="javascript:parent.sc" style="border:none; overflow: hidden;" scrolling="no" frameborder="0" onload="javascript:var x=document.getElementById('imiframe').contentWindow.document.images[0];this.width=x.width+10;this.height=x.height+10;"></iframe>
原理:通过iframe引用
优缺点:慢,吧
(未验证)
Curl
<?php
$url = $_GET["url"];
$dir = pathinfo($url);
$host = $dir['dirname'];
$refer = $host.'/';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_REFERER, $refer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//激活可修改页面,Activation can modify the page
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
$ext = strtolower(substr(strrchr($img,'.'),1,10));
$types = array(
'gif'=>'image/gif',
'jpeg'=>'image/jpeg',
'jpg'=>'image/jpeg',
'jpe'=>'image/jpeg',
'png'=>'image/png',
);
$type = $types[$ext] ? $types[$ext] : 'image/jpeg';
header("Content-type: ".$type);
echo $data;
原理:不发送Referer
优缺点:可以使用统计类组件,慢,需要大批量更换链接
使用方法:建立一个PHP文件在某个服务器上
http(s)://你的域名/img.php?url=照片地址
使用实例:
<img src="https://your-domain-name/img.php?url=https://ws3.sinaimg.cn/large/006tNbRwly1fyq4yujgssj30jg0jgmxg.jpg" />
(已验证可用)
Meta 标签
<meta name="referrer" content="never">
原理:不发送Referer,通过指定 name 值为 referrer 的 meta 标签
优缺点:统计类组件无法使用,因为统计也是通过这个原理
(未验证)
CSP 响应头
<meta http-equiv="Content-Security-Policy" content="referrer">
原理:CSP(Content Security Policy),是一个跟页面内容安全有关的规范。在 HTTP 中通过响应头中的 Content-Security-Policy 字段来告诉浏览器当前页面要使用何种 CSP 策略
(未验证)
<a>
标签的 Referer 属性
<a href="https://www.xsy.fun" referrer="no-referrer">XSY的FUN天地</a>
原理:在<a>
标签内添加no-referrer策略
优缺点:这种方式作用的只是这一个链接。
并且,<a>
标签可用的 Referrer 策略只有三种:no-referrer、origin 以及 unsafe-url 。
另外,这样针对单个链接设置的策略优先级比CSP要高。
Emmm
最好的办法就是使用自建图床或者使用对象储存
推荐阿里云的OSS,资费低,速度快,可以使用CDN全球加速(另收费)
云产品通用红包:点我
另外,迁移方案已经有大佬放出
参见Github:链接