一个懒癌患者的自言自语



突破防盗链限制

大部分的网站都默认Referer为空时可以正常访问,所以可以通过设置Referer为空的方式绕过,设置方式

1.代码内伪造,以php为例,设置为空或者伪造为允许通过的网址:

$http = new Http("http://www.baidu.com/img/avatar.jpg");
$http->setHeader('Referer:http://www.baidu.com/');

2.利用iframe伪造请求referer

function showImg( url ) {
       
var frameid = 'frameimg' + Math.random();
        window.img
= '<img id="img" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height =        document.getElementById(\'img\').height+\'px\'; }<'+'/script>';
        document.write(
'<iframe id="'+frameid+'" src="javascript:parent.img;" frameBorder="0" scrolling="no" width="100%"></iframe>');
}

3.nodejs方式

res.writeHead(200, {
   
'Content-Type': 'image/*'
});
let url
= req.query.url;
if (!url) {
    res.send(
"");
   
return false;
}
superagent.get(req.query.url)
    .set(
'Referer', '')
    .set(
"User-Agent",
       
'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.933.400 QQBrowser/9.4.8699.400'
    )
    .end(
function(err, result) {
       
if (err) {
           
//res.send(err);
            return false;
        }
        res.end(result.body);
       
return;
    });

4.https访问http

如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过

​5.meta标签控制referer

2014 年,W3C 的 Web 应用安全工作组(Web Application Security Working Group)发布了 Referrer Policy 草案,对浏览器该如何发送 Referrer 做了详细的规定。新版 Chrome 已经支持了这份草案,通过新的 Referrer Policy,我们可以针对第三方网站隐藏 Referrer,也可以只发送来源 URL 的 host 部分,从而实现绕过防盗链,不过有一点,新策略允许为空或者只发送部分,但是不能伪造,这点需要注意。新的 Referrer Policy 规定了五种 Referrer 策略:No Referrer、No Referrer When Downgrade、Origin Only、Origin When Cross-origin、和 Unsafe URL,详细解释如下:

  • No Referrer:任何情况下都不发送 Referrer 信息;
  • No Referrer When Downgrade:仅当发生协议降级(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则是现在大部分浏览器默认所采用的;
  • Origin Only:发送只包含 host 部分的 Referrer。启用这个规则,无论是否发生协议降级,无论是本站链接还是站外链接,都会发送 Referrer 信息,但是只包含协议 + host 部分(不包含具体的路径及参数等信息);
  • Origin When Cross-origin:仅在发生跨域访问时发送只包含 host 的 Referrer,同域下还是完整的。它与 Origin Only 的区别是多判断了是否 Cross-origin。需要注意的是协议、域名和端口都一致,才会被浏览器认为是同域;
  • Unsafe URL:无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略;

meta标签指定 Referrer方式

<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url">

所以我们通过meta标签指定 Referrer 策略来实现绕过防盗链,需要注意的是meta标签只能放在head标签之间,否则无效。比如设置Referrer为空使用如下设置:

<meta name="referrer" content="no-referrer"> 
​或 
<meta name="referrer" content="never">

设置只发送包含host部分的Referrer

<meta name="referrer" content="origin"> 

a标签也可以通过上面的策略方式进行设置,优先级比meta高,设置方式

<a href="http://example.com" referrer="no-referrer|origin|unsafe-url">xxx</a>(新,有的浏览器可能不支持)

<a href="http://example.com" rel="noreferrer">xxx</a>(旧)

About ME

about me

kevin

一个在it道路上蹒跚学步的人

心有多大,舞台就有多大,一直奔跑在自己的路上!

Contact ME