web服务资源防盗链技术实战
1、资源盗链基本介绍
1.1、什么是资源盗链?
简单的说,就是某些不法的网站,通过在其自身网站程序里未经过许可非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到了填充自身网站显示的效果,但是浪费了调用资源网站的网络流量,造成其他网站的带宽及服务压力吃紧,甚至宕机。
1.2、资源被盗链解决方法。
1、图片或视频上加水印,品牌等。
2、防火墙控制,根据IP控制。
3、防盗链(根据referer机制)
1.3、网站资源被盗链带来的问题。
当网站图片及相关资源被盗链后,最直接的影响就是网络带宽占用加大了,带宽费用多了,网络流量也可能忽高忽低,nagios/zabbix等报警服务频繁报警。
最严重的情况就是网站的资源被非法使用,导致网站带宽成本加大以及服务压力加大,多的导致数万元的损失以及网站的正常用户访问受到影响。
1.4、网站资源被盗链严重问题企业案例。
某公司的CDN源站,源站的流量没有变动CDN加速那边的流量无故超了好几个G,不知道怎么处理?曾经遇到过一张图片盗链不到一天,跑了20多个T的网络流量。
该故障的影响:由于是购买的CDN网站加速服务,虽然流量多了几个G,但是业务未受影响,这么大的异常流量持续下去可直接导致公司无故损失数万元。解决这个问题体现运维的价值。
那么这样的问题如何能够及时发现呢?
(1)对IDC及CDN带宽做监控报警。
(2)作为高级运维,每天上班的重要任务就是查看网站流量图,关注流量变化,关注流量异常。
(3)对日志做分析,对于异常流量能迅速定位,并且和公司市场推广等有比较好的默契和沟通交流,以便调度带宽和服务器资源。确保网站正常的访问体验得到保证。
2、Apache网站被盗链的解决方案。
2.1、常见防盗链解决方案的基本原理
1、根据http referer实现防盗链。
在http协议中,有一个表头字段叫referer,使用URL格式表示从哪里来的链接到当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站进行阻止或返回指定的页面。Apache,Nginx,Lighttpd三者都支持根据http referer实现防盗链。
2、根据cookie处理。
3、通过加密变换访问路径实现防盗链。Lighttpd有类似的插件mod_secdownload.
2.2、利用referer和rewrite实现Apache防盗链调用
在主配置文件httpd.conf或者在虚拟主机httpd-vhosts.conf中配置如下:
模拟盗链的网站blog.test.com
ServerAdmin [email protected]
DocumentRoot "/var/html/blog"
ServerName blog.test.com
ServerAlias blog.test.org
ErrorLog "logs/blog-error_log"
CustomLog "logs/blog-access_log" comom
ErrorDocument 500 http://test.blog.51cto.com
这是我们维护的网站要防止盗链。
ServerAdmin [email protected]
DocumentRoot "/var/html/bbs"
ServerName bbs.test.com
ErrorLog "logs/bbs-error_log"
CustomLog "/usr/local/sbin/cronolog /var/logs/access_bbs_%Y%m%d.log" combined
RewriteEngine On
RewriteCond %{HTTP_REFERER} ! ^http://blog.test.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} ! ^http://blog.test.org$ [NC]
RewriteCond %{HTTP_REFERER} ! ^http://bbs.test.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} ! ^http://bbs.test.org$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.abc.com/img/nolink.jpg [R,NC]!
上面这四个RewriteCond是一个判断,如果不是这些域名过来访问,且访问的后缀是下面的RewriteRule指定的扩展名,就给它转到nolink.jpg图片。
说明:
1、blog.test.org/bbs.test.org表示网站的信任站点。
2、gif|jpg|swf表示要保护的防止被盗链的文件的扩展名(以|分开)
3、nolink.jpg为上述扩展名的资源被盗链后的重定向页面/图片。用以输出警示信息,这张图片应该尽可能的小。
然后再blog.test.com网站中,发布博文调用bbs.test.org的提供的图片URL,这样就会转向http://www.abc.com/img/nolink.jpg,我们预先设置的转向图片,这个转向图片可能是版权信息的提示。
2.3、利用referer和rewrite实现Apache防盗链小结
通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。需要注意的是:不是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改referer,referer是可以被伪造的,上面配置只是一种简单的防护手段,应付一般的盗链也足够了。
2.4、利用cookie和rewrite实现Apache防盗链下载
常见的网站防盗链都是通过referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造referer了。
cookie配合rewrite模块很简单的可实现防盗链下载,首先在浏览页面的时候,会向客户端发送一个特别的cookie,例如:site=test.org,盗链而来的将没有这个cookie。
1、配置cookie和rewrite实现Apache防盗链下载
在主配置文件httpd.conf或者在虚拟主机httpd-vhosts.conf中配置如下:
ServerAdmin [email protected]
DocumentRoot "/var/html/bbs"
ServerName bbs.test.com
ErrorLog "logs/bbs-error_log"
CustomLog "|/usr/local/sbin/cronolog /var/logs/access_bbs_%Y%m%d.log" combined
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*(?: site=test.org).*$
#对于cookie里面没有特殊记录的请求进行重定向。
RewriteRule ^.*$ /error.html #将非法访问重定向到错误页面。
说明:这样如果一个盗链而来的请求将会因为没有特殊的cookie而被重定向到错误页面,就算实际地址暴露也不怕。至于这个cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说,下载工具也没办法伪造,从而防止了服务器资源被盗链的危险。
2、设置错误页面并重启web服务。
3、最后通过浏览器下载站点下内容,就会出现错误。
2.5、利用referer和filematch实现Apache防盗链下载。
SetEnvIfNoCase Referer “^http://www.test.org” local_ref=1
SetEnvIfNoCase Referer “^http://test.org” local_ref=1
Order Allow,Deny
Allow from env=local_ref
3、Nginx web服务实现防盗链实战
在默认情况下,只需要进行简单的配置即可实现防盗链处理,请看下面的实例:
3.1、利用referer并针对扩展名rewrite重定向。
location ~* \. (jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.test.org test.org;
if ($invalid_referer) {
rewrite ^/ http://www.test.org/img/nolink.jpg;
}
}
提示:要根据自己公司实际业务是否有外链合作,进行设置域名允许。
3.2、利用referer并且针对站点目录过滤返回错误码
针对目录
location /images {
root /data0/www/www
valid_referers none blocked *.test.org test.org;
if ($invalid_referer) {
return 403;
}
}
说明:在上面这段防盗链设置中,分别针对不同文件类型和不同的目录进行了设置,如有需要可根据自己的需求进行设置。
(1)“jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示对jpg、gif、png、swf、flv、wma、wmv、asf、mp3、mmf、zip和rar为后缀的文件实行防盗链处理。
(2)“*.test.org test.org”表示这个请求可以正常访问上面指定的资源。
(3)if {}中的内容的意思是:如果地址不是上面指定的地址,就跳转到rewrite指定的地址,也可以直接通过return返回403错误。
(4)return 403为自定义的http返回状态码。
(5)rewrite ^/ http://www.test.org/img/nolink.jpg;显示一张防盗链图片。
(6)access_log off;不记录访问日志,减轻压力。
(7)expires 3d所有文件3天的浏览器缓存。
3.3、NginxHttpAccessKeyModule实现防盗链介绍。
如果不怕麻烦,推荐使用NginxHttpAccessKeyModule这个东西,它的运行方式是:如果我的download目录下有一个file.zip的文件,对应的URL是http://www.ccvita.com/download/file.zip使用ngx_http_accesskey_module模块后http://www.ccvita.com/download/file.zip?key=09093abeac094,只有给定的key值正确了,才能给下载download目录下的file.zip文件,而且key值是根据用户的IP有关的,这样就可以避免被盗链了。据说NginxHttpAccessKeyModule现在连迅雷都可以防了。
3.4、Lighttpd web服务实现防盗链解决方案介绍。
1、利用referer并且针对扩展名。公司图片服务器是用Lighttpd提供web服务的,因此在Lighttpd上加防盗链,配置如下:
$HTTP[“referer”] !~ “^($|http://.*etnet.com.(cn|hk))” {
url.access-deny=(“.jpg”,”.jpeg”,”.png”,”.gif”,”.ico”,”.bmp”)
}
2、利用Lighttpd的防盗链模块加密访问路径。
lighttpd的防盗链模块“mod_secdownload”这个模块是把我们的访问地址路径加密了,隐藏了服务器的真实地址,从而起到了防盗链,但是这配置需要和部署的应用结合使用才能达到效果。
3.5、在产品设计上解决盗链方案。
为网站上传的图片添加版权水印,很多网站一般直接转载图片是为了快捷,但是对于有水印的图片很多站长是不愿意进行转载的。