文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[转帖]有关apache防止盗链

[转帖]有关apache防止盗链

时间:2008-04-25  来源:傲枭

apache错误日志中有大量下面的错误:
[Fri Nov 23 18:06:44 2007] [error] [client 121.46.232.16] File does not exist: /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/instal
ledApps/WebNode01Cell/defaultweb_war.ear/defaultweb.war/sdzq/keyboard.css, referer: http://www.sdzq.com/sdzq/

 Referer HTTP头字段

    当用户访问Web服务器请求一个页面时,用户浏览器发送的HTTP请求中会有一个被称为HTTP请求头(HTTP Request Header)的信息,这个头信息中包含客户请求的一些信息,例如发出请求客户主机的浏览器版本、用户语言、用户操作系统平台、用户请求的文档名等,这些信息以变量名/变量值的方式被传输。

    在这些信息中,Referer字段对于实现防止图片盗用非常重要。Referer字段指定客户端最后一个页面的URL地址。例如,如果用户访问页面A,然后点击在页面A上到页面B的链接,访问页面B的HTTP请求会包括一个Referer字段,该字段会包括这样的信息“这个请求是来自于页面A”。如果一个请求不是来自于某个页面,而是用户通过直接在浏览器地址栏输入页面A的URL地址的方式来访问页面A,那么在HTTP请求中则不会包括Referer字段。这样对于我们防止盗链有什么帮助呢?Referer字段是帮助判断对图像的请求是来自自己的页面,还是来自其它网站。

解决:

方法一:使用FilesMatch

    在Apache配置文件中添加如下内容:

    <VirtualHost *:80>
    DocumentRoot D:/www/www.chinahtml.com
    盗用连接指定显示的页面。也可以不用此项,这样盗用连接也可无法使用。
    ErrorDocument 404 http://www.sdzq.com/error.html
    允许www.aaa.com的网站使用
    SetEnvIfNoCase Referer "^http://www.aaa.com" local_ref=1
    允许 aaa.com  的网站使用
    SetEnvIfNoCase Referer "^http://aaa.com" local_ref=1
    定义防盗文件的扩展名
      <FilesMatch "\.(gif|jpg|png|css|js|swf)">
        Order Allow,Deny
        Allow from env=local_ref  允许上面指定域名
     </FilesMatch>
     </VirtualHost>
    也可以不在在虚拟机中,即对整个配置文件起作用。

    当Apache处理一个请求时,它会检查HTTP请求头中的Referer字段,如果该请求来源于上面定义的域名,则设置环境变量local_ref为1,“NoCase”部分表示这里的正则表达式忽略大小写。

   这样只有在local_ref变量被定义的情况下,该请求才会被允许;否则其它所有请求和访问将会被拒绝,因为这些请求不满足Allow条件。

    如上配置可以存放在服务器配置文件httpd.conf中,或者存放在.htaccess文件中,最后的效果是一样的:在这些命令作用的范围内,只有从本网站引用的图片才可以被访问。
   
   还可以使用正则表达式
   使用正则表达式

 SetEnvIf Referer "^http://(.)+\.linux\.cn/" local_ref=1
 SetEnvIf Request_URI "/logo(.)+" local_ref=0
 <FilesMatch "\.(mp3|wmv|png|gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip|mp3)">
 Order Allow,Deny
 Allow from env=local_ref
 </FilesMatch>
 第一行的意思为所有http协议访问,以.linux.cn结尾的域名地址
 第二行表示不在上述引用域名范围内,但可以被放行的特例,本例中表示网站/目录,所有以logo开头的文件(用作允许其它网站的友情连接引用本站logo)


方法二:使用rewirte方式
 LoadModule rewrite_module modules/mod_rewrite.so 

 在你的虚拟机配置段下添加
 <VirtualHost *:80>  
     DocumentRoot /opt/apache/web  
     ServerName www.web.com  
  //以下是配置url重写  
     RewriteEngine on  
     RewriteCond %{HTTP_REFERER} !^$  
     RewriteCond %{HTTP_REFERER} !^http://www.web.com/demo/.*$  [NC] //NC是忽略大小写  
     RewriteRule \.(mp3)$ http://www.sohu.com [R=301,L] //R是redirect L是link  
 </VirtualHost> 
 说明:
 RewriteEngine on 打开url重写引擎
 RewriteCond url重写条件 
 RewriteCond %{HTTP_REFERER} !^$  
 RewriteCond %{HTTP_REFERER} !^http://www.web.com/demo/.*$  [NC]  

 这两句的意思是 如果referer字段不为空 并且(默认是并且,也可用[OR])不匹配^http://www.web.com/demo/.*$这个正则模式就执行RewriteRule
 RewriteRule \.(mp3)$ http://www.sohu.com [R=301,L]  

 这句的意思是如果url是以.mp3结尾,就redirect到http://www.sohu.com
 这样我们就可以有效的防止别人盗链,上面只是应用了mp3文件 扩展一下可以应用到任何文件。

   
 其他:记录盗用请求

     如果想知道自己网站是否被盗,可以尝试使用同样的侦测和环境变量来记录可疑请求。例如,在httpd.conf文件中添加如下命令,那么会在/opt/apache/logs/poachers_log文件中记录所有具有非法的Referer头信息的访问请求:

 SetEnvIfNoCase Referer      "!^http://my\.apache\.org/" not_local_ref=1
 SetEnvIfNoCase Request_URI  "\.(gif|jpg)"               is_image=1
 RewriteEngine  On
 RewriteCond    ${ENV:not_local_ref} =1
 RewriteCond    ${ENV:is_image}      =1
 RewriteRule    .*                   -     [Last,Env=poach_attempt:1]
 CustomLog logs/poachers_log         CLF   env=poach_attempt

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载