要了解什么是防盗链,那就得先说说什么是盗链。
盗链
盗链简单地可以理解成别人偷偷盗用了访问自己资源的链接。盗链比较常见的就是一些小网站盗用大的网站的资源(图片、视频、音乐等),将这些资源的地址直接放在自己的页面上,使得自己的用户可以自己通过自己的网站访问到并不在自己服务器上的内容。这样既可以向用户提供此内容,又可以将访问服务器的负担转移到别人的服务器上。
防盗链
简而言之,防盗链就是防止别人的盗链行为。让盗用自己资源的请求失效,从而减轻自己服务器的压力。
防盗链如何实现?
防盗链的实现可以通过设置HTTP Header中的Referer实现。当浏览器向服务器发送请求的时候,请求头中包含了Referer用于告诉服务器这个请求是来自哪里的,服务器可以借助这个字段进行防盗处理。后台可以获取到请求中的referer,如果请求来源不是本站则进行阻止或返回其他页面。
如果Http头不包含referer,也就是通过浏览器地址栏直接访问该资源URL,服务器就返回页面。
如果盗用网站是 https 的 协议,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。
或者使用nginx的allow、deny
nginx访问控制allow、deny(ngx_http_access_module)
https://www.cnblogs.com/wangyongsong/p/8204698.html
如何突破防盗链
-
如果盗用图片资源是
http协议那么盗用网址可以使用 https 去请求会因为安全性的规定,而不带referer,从而实现防盗链的绕过。 -
referer为空
-
代码内请求伪造referer,或者服务端伪造请求头
-
在 HTML 代码的 head 中添加一句
<meta name="referrer" content="no-referrer" /> -
<img referrer="no-referrer|origin|unsafe-url" src="{item.src}"/> -
https://images.weserv.nl/?url=${你的图片地址}因为网址是国外的速度有点慢效果还行,目的就是返回一个不受限制的图片,但是 GIF 格式会返回jpg也就是没有了动画效果。
-
利用iframe伪造请求referer
1
2
3
4
5function 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>');
}
反破解
既然有破解就当然有常用的防御机制😄
- 不允许
referer为空(不建议,因在某些开启隐私模式的浏览器中,或 https 页面引用下,referer是空的) - 地址变更(
lighttpd的是根据有效时间,nginx的根据是md5,IP地址变化) - 登录校验(如必须登录网站帐号后才能访问)
以下是防止网站被镜像,被 iframe
1. 防止网站被镜像(被恶意解析和转发等)
现象:他人域名访问到的是我的网站解析的 ip 地址我的
解决方法:
http.ini里可以这样写
1 |
"RewriteCond Host: !^www.web.cn$ RewriteRule (.*) http://www.web.cn$1 [I,RP]" |
.htaccess里可以这样写
1 |
“RewriteCond %{HTTP_HOST} !^www.web.cn$ [NC] RewriteRule ^(.*)$ http://www.web.cn/$1 [L,R=301]” |
代码的意思非常简单:访问这个网站的域名如果不是 “www.web.cn" 就自动跳转到 “www.web.cn" 上。这样设置就不怕自己辛辛苦苦维护的网站被别人镜像了。
2. 防止网址被 iframe
代码:在页面底部或其它公用部位加入如下代码
1 |
<script type=”text/javascript> if(window!=parent) window.top.location.href = window.location.href; < /script> |
代码的意思也很简单,用js方法检测地址栏域名是不是当前网站绑定的域名,如果不是,则跳转到绑定的域名上来,这样就不怕网站被别人 iframe了。