1、Nginx图片及目录防盗链解决方案
资源盗链:盗用别人的网站资源,达到装饰自己网站的效果,导致盗用网站的带宽、压力增大;
1.1网站资源被盗出现严重问题及防御
- CDN网站加速服务流量超了好几个GB
- 对IDC及CDN带宽做监控报警
- 经常查看流量图,关注流量变化,关注异常流量
- 对访问日志做分析,迅速定位异常流量
1.2常用防盗链解决方案的基本原理
(1)根据HTTP referer实现防盗链
在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示是哪里的链接用了当前网页的资源,通过referer可以检测访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止或返回指定的页面。
HTTP referer是header的一部分,但浏览器向Web服务器发送请求时,一般会带上referer,告诉服务器我是从那个页面链接过来的,服务器借此获得一些信息用于处理。Apache、Nginx、Lighttpd三者都支持根据HTTP referer实现防盗链,referer是目前网站图片、附件、html等最常用的防盗链手段。
(2)根据cookie防盗链
对于Flash、Windows Media视频这种占用流量较大的业务数据,防盗链是比较困难的,此时可以采用Cookie技术,解决Flash、Windows Media视频等的防盗链问题。
例如:ActiveX插件不传递referer,但会传递Cookie,可以在显示ActiveX的页面的<head></head>标签内嵌入一段JavaScript代码,设置”Cookie Cache=av”如下:
<script> document.cookie="Cache=av;domain.com;path=/"; </script>
然后就可以通过各种手段来判断Cookie的存在,以及验证其值的操作了。
(3)通过加密变换访问路径实现防盗链
此种方法比较适合视频及下载类业务数据的网站。例如:Lighttpd
有类似的插件mod_secdownload
来实现此功能。先在服务器端配置此模块,设置一个固定用于加密的字符串,比如chengzi
,然后设置一个url前缀,比如/mp4/,再设置一个过期时间,比如1小时,然后写一段PHP代码,利用加密字符串和系统时间等通过md5算法生成一个加密字符串。最终获取到的文件的URL链接中会带有一个时间戳和一个加密字符的md5值,在访问时系统会对这两个数据进行检验。如果时间不在预期的时间段内(如1小时内)则失效;如果时间戳符合条件,但是加密的字符串不符合条件也会失效,从而达到防盗链的效果。
PHP代码实例如下:
<?php $secret = "chengzi"; //加密字符串,必须和lighttpd.conf里的保持一致 $uri_prefix = "/mp4/"; //虚拟的路径、前辍,必须和lighttpd.conf里的保存一致 $file = "/test.mp4"; //实际文件名,必须加“/”斜杠 $timestamp = time(); //current timestamp $t_hex = sprintf("%80x",$timestamp); $m = md5($secret.$file.$t_hex); printf('%s',$uri_prefix,$m,$t_hex,$file,$file); //生成uri地址串 ?>
1.3Nginx Web服务实现防盗链实战
(1)利用referer,并且针对扩展名rewrite重定向
下面的代码为利用referer
且针对扩展名rewrite
重定向,实现防盗链的Nginx配置:
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { valid_referers none blocked *.xionghaier.cn xionghaier.cn; if ($invalid_referer) { rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg; } }
设置expires
的方法如下:
[root@iZm5eh8g1nh0vcbupue6dnZ nginx]# vim conf.d/blog.conf
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http://xionghaier.centoscn.cn/$1 permanent;
}
server {
listen 80;
server_name xionghaier.centoscn.cn;
location / {
root html/blog;
index index.php index.html index.htm;
}
location ~* .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.xionghaier.cn xionghaier.cn;
if ($invalid_referer) {
rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg;
}
access_log off;
expires 1d;
break;
}
}
(2)利用referer,并且针对站点目录过滤返回错误码
针对目录的方法如下:
location /images { root /data0/www/www; valid_referers none blocked *.xionghaier.cn xionghaier.cn; if ($invalid_referer) { return 403; } }
上述代码说明:
- “jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示对.jpg .gif .png .swf .flv .wma .wmv .asf .mp3 .mmf .zip和.rar为后缀的文件实行防盗链处理。
- “*.xionghaier.cn xionghaier.cn”表示这个请求可以正常访问上面指定的文件资源。
- if{}中内容的意思是如果地址不是上面指定的地址就跳转到通过rewrite指定的地址,也可以直接通过return返回403错误。
- return 403 为自定义的http返回状态码。
- rewrite ^/ https://www.xionghaier.cn/img/nolink.jpg 表示显示一张防盗链图片;
- access_log off;表示不记录访问日志,减轻压力。
- expires 3d指的是所有文件设置3天的浏览器缓存。
1.4Nginx Http Access Key Module实现防盗链介绍
如果不怕麻烦,有条件的话,推荐使用Nginx Http Access Key Module。
其运行的方式是:如download目录下有一个file.zip的文件。对应的URI是http://www.abc.com/download/file.zip,使用ngx_http_accesskey_module模块后就成了http://www.abc.com/download/file.zip?key=09093abeac094,只有正确地给定了key值,才能下载download目录下的file.zip,而且key值是与用户的IP相关的,这样就可以避免被盗链了
2.错误页面优雅显示
范例:将错误状态码重定向到一个location,命令如下:
location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; }
阿里门户网站天猫的Nginx优雅显示配置案例如下:
error_page 500 501 502 503 504 http://err.tmall.com/error2.html; error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;
1.5Nginx站点目录文件及目录权限优化
1.单机LNMP环境目录权限严格控制措施
为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有的目录权限是755;所有的文件权限是644。设置如下:
[root@izm5eh8g1nh0vcbupue6dnz blog]# chown root.root `ls /usr/share/nginx/html/blog/|tail -5` [root@izm5eh8g1nh0vcbupue6dnz blog]# [root@izm5eh8g1nh0vcbupue6dnz blog]# ls -l /usr/share/nginx/html/blog/|tail -5 -rw-r--r-- 1 root root 8048 Jan 11 2017 wp-mail.php -rw-r--r-- 1 root root 16255 Dec 21 05:50 wp-settings.php -rw-r--r-- 1 root root 29896 Oct 19 2016 wp-signup.php -rw-r--r-- 1 root root 4513 Oct 15 2016 wp-trackback.php -rw-r--r-- 1 root root 3065 Sep 1 2016 xmlrpc.php
以上的权限设置可以防止黑客上传木马,以及修改站点文件,但是,合理的网站用户上传的内容也会被拒之门外。那么如何让合法的用户可以上传文件,又不至于被黑客利用攻击呢?
如果是单机的LNMP环境,站点目录和文件属性设置如下。
先把所有的目录权限设置为755,所有的文件权限设置为644,所用的目录及文件用户和组都是root;然后针对上传资源的目录权限设置为755,将用户和组设置为Nginx服务的用户,最后针对上传资源的目录做资源访问限制。
服务器角色:动态Web集群 static图片集群 上传upload集群
权限处理:动态Web集群,目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx+php
static图片集群,目录755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx
上传upload集群,目录权限755,文件权限644,所用目录及文件用户和组都是root,用户上传的目录设755,用户组用Nginx
1.6Nginx防爬虫优化
Nginx放爬虫优化配置
我们可以根据客户端的user-agents信息,轻松地阻止指定的爬虫爬取网站
范例1:阻止下载协议代理,命令如下:
if ($http_user_agent ~* LWP::Simple|bbbike|wget) {
return 403;
}
如果用户匹配了if后面的客户端如wget,就返回403;
范例2:添加内容防止N多爬虫代理访问网站,命令如下:
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googbot-Image|Mediapartners-Google|...") { return 403; }
范例3:禁止不同的浏览器软件访问:
if ($http_user_agent ~* "Firefox|MSIE") { rewrote ^(.*) https://www.xionghaier.cn/$1 permanent; }
1.7利用Nginx限制HTTP的请求方法
限制http的请求达到提升服务器安全的目的,例如http只能使用get head post方法的配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; }
在上传的服务器upload上现在http的get方法的配置:
if ($request_method ~* ^(GET)$ ) { return 501; }
- 转载请注明来源:NGINX之企业优化最佳实践二
- 本文永久链接地址:https://www.xionghaier.cn/archives/21.html