Chinaunix首页 | 论坛 | 博客
  • 博客访问: 806555
  • 博文数量: 142
  • 博客积分: 10288
  • 博客等级: 上将
  • 技术积分: 2905
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-03 13:19
文章分类

全部博文(142)

文章存档

2019年(2)

2009年(51)

2008年(89)

分类: 系统运维

2008-04-25 17:23:43

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:

 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配置文件中添加如下内容:

   
    DocumentRoot D:/www/
    盗用连接指定显示的页面。也可以不用此项,这样盗用连接也可无法使用。
    ErrorDocument 404

    允许的网站使用
    SetEnvIfNoCase Referer "^" local_ref=1
    允许 aaa.com  的网站使用
    SetEnvIfNoCase Referer "^" local_ref=1
    定义防盗文件的扩展名
     
        Order Allow,Deny
        Allow from env=local_ref  允许上面指定域名
    

    
    也可以不在在虚拟机中,即对整个配置文件起作用。

    当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
 
 Order Allow,Deny
 Allow from env=local_ref
 

 第一行的意思为所有http协议访问,以.linux.cn结尾的域名地址
 第二行表示不在上述引用域名范围内,但可以被放行的特例,本例中表示网站/目录,所有以logo开头的文件(用作允许其它网站的友情连接引用本站logo)


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

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

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

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

   
 其他:记录盗用请求

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

 SetEnvIfNoCase Referer      "!^\.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

阅读(1135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~