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)对IDCCDN带宽做监控报警。

  2)作为高级运维,每天上班的重要任务就是查看网站流量图,关注流量变化,关注流量异常。

  3)对日志做分析,对于异常流量能迅速定位,并且和公司市场推广等有比较好的默契和沟通交流,以便调度带宽和服务器资源。确保网站正常的访问体验得到保证。

 

2Apache网站被盗链的解决方案。

2.1、常见防盗链解决方案的基本原理

1、根据http referer实现防盗链。

http协议中,有一个表头字段叫referer,使用URL格式表示从哪里来的链接到当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站进行阻止或返回指定的页面。ApacheNginxLighttpd三者都支持根据http referer实现防盗链。

 

2、根据cookie处理。

 

3、通过加密变换访问路径实现防盗链。Lighttpd有类似的插件mod_secdownload.

2.2、利用refererrewrite实现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图片。

说明:

1blog.test.org/bbs.test.org表示网站的信任站点。

2gif|jpg|swf表示要保护的防止被盗链的文件的扩展名(以|分开)

3nolink.jpg为上述扩展名的资源被盗链后的重定向页面/图片。用以输出警示信息,这张图片应该尽可能的小。

 

        然后再blog.test.com网站中,发布博文调用bbs.test.org的提供的图片URL,这样就会转向http://www.abc.com/img/nolink.jpg,我们预先设置的转向图片,这个转向图片可能是版权信息的提示。

2.3、利用refererrewrite实现Apache防盗链小结

         通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。需要注意的是:不是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改refererreferer是可以被伪造的,上面配置只是一种简单的防护手段,应付一般的盗链也足够了。

2.4、利用cookierewrite实现Apache防盗链下载

          常见的网站防盗链都是通过referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造referer了。

cookie配合rewrite模块很简单的可实现防盗链下载,首先在浏览页面的时候,会向客户端发送一个特别的cookie,例如:site=test.org,盗链而来的将没有这个cookie

 

1、配置cookierewrite实现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、利用refererfilematch实现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

3Nginx 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”表示对jpggifpngswfflvwmawmvasfmp3mmfziprar为后缀的文件实行防盗链处理。

 2)“*.test.org test.org”表示这个请求可以正常访问上面指定的资源。

 3if {}中的内容的意思是:如果地址不是上面指定的地址,就跳转到rewrite指定的地址,也可以直接通过return返回403错误。

 4return 403为自定义的http返回状态码。

 5rewrite ^/ http://www.test.org/img/nolink.jpg;显示一张防盗链图片。

 6access_log off;不记录访问日志,减轻压力。

 7expires 3d所有文件3天的浏览器缓存。

3.3NginxHttpAccessKeyModule实现防盗链介绍。

            如果不怕麻烦,推荐使用NginxHttpAccessKeyModule这个东西,它的运行方式是:如果我的download目录下有一个file.zip的文件,对应的URLhttp://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.4Lighttpd 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、在产品设计上解决盗链方案。

 为网站上传的图片添加版权水印,很多网站一般直接转载图片是为了快捷,但是对于有水印的图片很多站长是不愿意进行转载的。