1、原理javascript
先说说防盗链的原理,http 协议中,若是从一个网页跳到另外一个网页,http 头字段里面会带个 Referer。图片服务器经过检测 Referer 是否来自规定域名,来进行防盗链。css
若是盗用网站是 https 的 protocol,而图片连接是 http 的话,则从 https 向 http 发起的请求会由于安全性的规定,而不带 referer,从而实现防盗链的绕过。java
好比如今在 cnode 这里,因为咱们启用了 https,因此任何 http 的图片几乎均可以直接贴过来并显示了。node
官方输出图片的时候,判断了来源(Referer),就是从哪一个网站访问这个图片,若是是你的网站去加载这个图片,那么Referer就是:你的网站地址;;你网站地址,确定没在官方的白名单内,因此就看不到图片了。nginx
所以,若不发送Referer,也就是没有来源。那么官方那边,就认为是从浏览器直接访问的,因此就能加载正常的图片了。浏览器
2、应对方法安全
破解盗链服务器
实现代码:dom
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点:
一、不容许referer为空(不建议,因在某些开启隐私模式的浏览器中,或https页面引用下,referer是空的)
二、地址变动(lighttpd的是根据有效时间,nginx的根据是md5)
三、登陆校验(如必须登陆网站账号后才能访问)