了解到高并发解决方案,其中的流量优化——防盗链处理
这儿我主要记录一下LNMP架构下的防盗链处理
首先我们得知道什么是盗链?
盗链是指在自己的页面上展现一些并不是自己服务器上的内容,获得他人服务器上的资源的地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。
什么是防盗链?
防止别人通过一些技术手段绕过本站资源展示页面,盗用本站的资源,让绕开本站资源展示页面资源链接失效。可以大大减轻服务器的压力。
防盗链的工作原理
通过Referer或者 签名 的方式,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。一旦检测到来源不是本站即进行阻止或者返回指定的页面。
上面介绍了一些原理在介绍实现防盗链的方法之前给大家科普一下Referer
下面是我随便抓取的一个HTTP的请求包,可以看出Referer是HTTP 报文 的Header头域,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
PHP获取Referer的方式是: $_SERVER['HTTP_REFERER'] 。
通过上面的了解,现在讲解一下防盗链的实现方法
1.Referer方法
使用nginx模块:ngx_http_referer_module 用于阻挡来源非法的域名请求。
涉及到的 指令:valid_referers 全局变量: $invalid_referer
配置指令原型: valid_referers none | blocked | server_name | string ....;
none: 可省略,如果设置了,当Referer为空时,服务器也判定该来源是合法的
blocked:当Referer来源头不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头
server_name:我们信任的一些地址
配置nginx.conf实现例子如下:
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)${
valid_referers none blocked ccmanito.cn *.ccmanito.com;
if($invalid_referer){
#return 403;
rewrite ^/ http://www.ccmanito.cn/403.jpg;
}
}
上述方法虽然可以防盗链但是有很大的不足,因为利用的是Referer来屏蔽,但是现在有很多方法可以伪造Referer,至于怎么去伪造Referer就是伪造HTTP请求头,方法很多,感兴趣的同学可以去get一下。
2.加密签名
在请求的资源后面加入加密过的参数,通过这个参数来识别来源是否是可信任的
nginx服务器使用第三方模块 HttpAccesskeyModule 实现防盗链
第三方模块需要安装 自行安装
模块一些配置项
accesskey on|off 模块开关
accesskey_hashmethod md5 | sha-1 签名加密方式 :这块服务器加密和PHP那块加密必须使用相同的加密方式
accesskey_arg GET参数的名称
accesskey_signature 加密规则
nginx配置文件的实例:
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)${
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}
php实现方式如下:
<?php
//定义好这个加密参数为$sign
$sign = md5('自定义字符串'.$SERVER['REMOTE_ADDR']);
/*然后在以后资源访问时,在URI后面加上这个参数,把这个参数发送给服务器。服务器通过这个加密参数来判别这个来源是否有权限访问这个资源。*/
例:
echo '<ing src = "./logo_new.png?sign = '.$sign.'">'; //访问时带上参数,这时nginx会验证这个key
?>
使用加密签名方式很好的实现了防盗链,但是有个问题不得不考虑就是我们在写代码时,不得不在每个访问资源得URI后面加上这个加密参数。所以比较繁琐。
以上就是PHP+nginx实现防盗链的处理,方法很多,大家可以去看看其他的实现方法,可以做以比较,加深印象。