分类: 系统运维
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