图片防盗链原理及应对方法

一、原理

先说说防盗链的原理,http 协议中,如果从一个网页跳到另一个网页,http 头字段里面会带个 Referer。图片服务器通过检测 Referer 是否来自规定域名,来进行防盗链。

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

比如现在在 cnode 这里,由于我们启用了 https,所以任何 http 的图片几乎都可以直接贴过来并显示了。

官方输出图片的时候,判断了来源(Referer),就是从哪个网站访问这个图片,如果是你的网站去加载这个图片,那么Referer就是:你的网站地址;;你网站地址,肯定没在官方的白名单内,所以就看不到图片了。

因此,若不发送Referer,也就是没有来源。那么官方那边,就认为是从浏览器直接访问的,所以就能加载正常的图片了。

二、应对方法

1: <meta name="referrer" content="never">

html头添加这段代码 表示请求头的不发送referrer

2:iframe

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>');
}

  调用方式:

showImg('图片地址');

  

关于防御方法,有以下3点:

  1、不允许referer为空(不建议,因在某些开启隐私模式的浏览器中,或https页面引用下,referer是空的)
  2、地址变更(lighttpd的是根据有效时间,nginx的根据是md5)
  3、登录校验(如必须登录网站帐号后才能访问)

猜你喜欢

转载自www.cnblogs.com/sheseido/p/9849051.html