11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch相关的知识,希望对你有一定的参考价值。

- 11.25 配置防盗链
- 11.26 访问控制Directory
- 11.27 访问控制FilesMatch
- 扩展
1. 几种限制ip的方法 http://ask.apelearn.com/question/6519
2. apache 自定义header http://ask.apelearn.com/question/830
3. apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556


# 11.25配置防盗链
- 通过限制referer来实现防盗链的功能
 配置文件增加如下内容
```
  <Directory /data/wwwroot/www.123.com>
        SetEnvIfNoCase Referer "http://www.123.com" local_ref
        SetEnvIfNoCase Referer "http://123.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
            Order Allow,Deny
            Allow from env=local_ref
        </filesmatch>
    </Directory>
  ```  
-  curl -e "http://www.aminglinux.com/123.html" 自定义referer
-  盗链的定义
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
- 为什么会产生盗链
- 一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。

- 配置防盗链
- 先打开虚拟主机配置文件
```
[[email protected] 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com 2111.com.cn
    #<Directory /data/wwwroot/111.com>
    # <FilesMatch 123.php>    
    #   AllowOverride AuthConfig 
    #   AuthName "111.com user auth" 
    #   AuthType Basic 
    #   AuthUserFile /data/.htpasswd 
    #   require valid-user
    #</FilesMatch> 
    #</Directory>
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^111.com$
        RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]
    </IfModule>
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/gif  "access plus 1 days"
    ExpiresByType image/jpeg "access plus 24 hours"
    ExpiresByType image/png "access plus 24 hours"
    ExpiresByType text/css "now plus 2 hour"
    ExpiresByType application/x-javascript "now plus 2 hours"
    ExpiresByType application/javascript "now plus 2 hours"
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
</IfModule>

    ErrorLog "logs/111.com-error_log"
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
               
```
- 添加配置
```
    #</Directory>
    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://aaa.com" local_ref
        #SetEnvIfNoCase Referer "^$" local_ref
        <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
            Allow from env=local_ref
        </FilesMatch>
    </Directory>

    ErrorLog "logs/111.com-error_log"
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
:wq                 
```
- 然后检查配置文件,重新加载
```
[[email protected] ~]# cd /data/wwwroot/111.com/
[[email protected] 111.com]# ls
123.php  baidu.png  index.php
[[email protected] 111.com]# mv baidu.png qq.png
[[email protected] 111.com]# ls
123.php  index.php  qq.png
[[email protected] 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[[email protected] 111.com]# 
```
- 再用windows访问下111.com/qq.png 
- ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20171011/214120293.png?imageslim)
- Forbidden
You don‘t have permission to access /qq.png on this server.
- 这是空referer 被禁止访问
- 再进虚拟主机配置文件  把SetEnvIfNoCase Referer "^$" local_ref 的注释去掉
```
    #</Directory>
    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://aaa.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
            Allow from env=local_ref
        </FilesMatch>
    </Directory>

    ErrorLog "logs/111.com-error_log"
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
-- 插入 --      
```
- 保存退出,重新检查语法 重新加载配置文件
- 使用curl 命令访问下111.com/qq.png 用浏览器访问也是可以的
```
[[email protected] 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[[email protected] ost 111.com]# curl -x127.0.0.1:80 111.com/qq.png -I
HTTP/1.1 200 OK
Date: Wed, 11 Oct 2017 13:46:08 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Last-Modified: Tue, 10 Oct 2017 12:44:26 GMT
ETag: "e7a-55b30aad1fe80"
Accept-Ranges: bytes
Content-Length: 3706
Content-Type: image/png

[[email protected] 111.com]# 
```
-  ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20171011/214744107.png?imageslim)
-  crul -e用来指定它的 rerferer 也可以模拟referer
-  用curl 来模拟查看 referer情况模拟referer的 需用用到-e选项,模拟的地址需要用“”双引号括起来
```
[[email protected] 111.com]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/qq.png -I
HTTP/1.1 403 Forbidden
Date: Wed, 11 Oct 2017 13:49:51 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[[email protected] 111.com]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/qq.png -I
HTTP/1.1 200 OK
Date: Wed, 11 Oct 2017 13:50:14 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Last-Modified: Tue, 10 Oct 2017 12:44:26 GMT
ETag: "e7a-55b30aad1fe80"
Accept-Ranges: bytes
Content-Length: 3706
Content-Type: image/png

[[email protected] 111.com]#

[[email protected] 111.com]# tail /usr/local/apache2.4/logs/111.com-access_log 
127.0.0.1 - aming [09/Oct/2017:00:26:45 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7
192.168.202.131 - - [09/Oct/2017:20:29:12 +0800] "GET HTTP://111.com/ HTTP/1.1" 200 7
192.168.202.131 - - [09/Oct/2017:20:32:46 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 -
192.168.202.131 - - [09/Oct/2017:20:37:18 +0800] "HEAD http://111.com/123.php HTTP/1.1" 403 -
192.168.202.131 - - [09/Oct/2017:20:41:18 +0800] "HEAD http://111.com/123.php HTTP/1.1" 200 -
192.168.202.131 - - [09/Oct/2017:22:01:53 +0800] "HEAD http://111.com/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
192.168.202.131 - - [09/Oct/2017:22:02:25 +0800] "HEAD http://111.com/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [10/Oct/2017:20:38:51 +0800] "HEAD HTTP://111.com/alskdjflks HTTP/1.1" 404 - "-" "curl/7.29.0"
127.0.0.1 - - [10/Oct/2017:20:41:26 +0800] "HEAD HTTP://111.com/alskdjflks HTTP/1.1" 404 - "-" "curl/7.29.0"
127.0.0.1 - - [10/Oct/2017:20:54:16 +0800] "HEAD HTTP://111.com/baidu.png HTTP/1.1" 200 - "-" "curl/7.29.0"

```
- 通过以上测试结果,可以知道。做了放到配置以后,只能通过”http://www.111.com”、”http://111.com”跳转到的之后图片,才能进行正常访问,其他地址跳转过去的是没有办法直接访问的











# 11.26 访问控制Directory
- 使访问安全,更加安全;使用用户认证,也有可能因为用户账号密码丢失导致被其他人访问,所有就有了限制白名单IP访问,只有白名单的IP才能访问

- 核心配置文件内容
  <Directory /data/wwwroot/www.123.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>
-  curl测试状态码为403则被限制访问了

- 首先打开配置文件 添加配置文件为
```
   #</FilesMatch> 
    #</Directory>
    <Directory /data/wwwroot/111.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>

    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://aaa.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
            Allow from env=local_ref
        </FilesMatch>
    </Directory>
:wq      
```
- 检查语法,重新加载
```
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl graceful
```
- 在111.com 目录下创建admin admin目录下创建index.php 内容为121212
```
[[email protected] 111.com]# ls
123.php  admin  index.php  qq.png
[[email protected] 111.com]# ls admin/
index.php
[[email protected] 111.com]# cat admin/index.php
121212
[[email protected] 111.com]# 
```
- Order 用来指定先后顺序,先deny还是先allwo,如果是deny,allow    表示先执行deny 语句,后执行Allow语句;反之顺序反置
        Order deny,allow                             //执行顺序
        Deny from all                                  //Deny 规则
        Allow from 127.0.0.1                      //Allow 规则
- 可以理解为,先拒绝所有,然后又允许了 127.0.0.1的访问,这个顺序,是全部执行,会把所有的语句都运行一遍
- 整个命令可以理解为,只允许127.0.0.1的IP去进行访问/data/wwwroot/111.com/admin 这个目录 换个一个IP都无法进行


- 再来访问下是可以的
```
[[email protected] 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Wed, 11 Oct 2017 14:29:55 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

[[email protected] 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
121212
[[email protected] 111.com]# 
```
- 如果把源ip换掉,把目标ip一变 源ip也就跟着变
```
[[email protected] 111.com]# curl -x192.168.202.131:80 111.com/admin/index.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don‘t have permission to access /admin/index.php
on this server.<br />
</p>
</body></html>
[[email protected] 111.com]# 

[[email protected] 111.com]# curl -x192.168.202.131:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Wed, 11 Oct 2017 14:35:39 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[[email protected] 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
121212
[[email protected] 111.com]# 

```
- 查看日志文件
```
[[email protected] 111.com]# cat /usr/local/apache2.4/logs/123.com-access_20171011.log 
192.168.202.1 - - [11/Oct/2017:21:39:35 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://111.com/qq.png" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
127.0.0.1 - - [11/Oct/2017:21:51:35 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [11/Oct/2017:22:29:55 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [11/Oct/2017:22:30:01 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 7 "-" "curl/7.29.0"
192.168.202.1 - - [11/Oct/2017:22:31:35 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
192.168.202.131 - - [11/Oct/2017:22:35:39 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
192.168.202.131 - - [11/Oct/2017:22:35:44 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 403 224 "-" "curl/7.29.0"
127.0.0.1 - - [11/Oct/2017:22:37:40 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 7 "-" "curl/7.29.0"
[[email protected] 111.com]# 
```








# 11.27 访问控制FilesMatch
- 访问访问控制除了目录的形式之外,可以通过匹配目录,也可以匹配文件名或者链接,都可以
- 
可以使用FilesMatch进行配置
- 核心配置文件内容
<Directory /data/wwwroot/www.123.com>
    <FilesMatch  "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>

- 修改虚拟主机配置文件为
```
      #</Directory>
    <Directory /data/wwwroot/111.com>
        <FilesMatch  "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
    </Directory>


    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://aaa.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
-- 插入 --  
```
- 检查 重新加载
```
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] 111.com]# /usr/local/apache2.4/bin/apachectl graceful
```
- 再来访问
- curl 在测试URL连通性的时候 如果遇到有特殊符号需要用 ” 单引号括起来
curl -x127.0.0.1:80 ‘http://111.com/admin.php?alsjdf’ -I
- 当使用FilesMatch 控制一些页面的时候,这个时候再去控制目录的话,就会是FilesMatch 的作用有些多余,所以FilesMatch
- 对文件使用还是很好的,FilesMatch,可以满足一些比较个性化的需求

```
[[email protected] 111.com]# curl -x192.168.202.131:80 http://111.com/admin/alsjdf -I
HTTP/1.1 404 Not Found
Date: Wed, 11 Oct 2017 15:04:35 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[[email protected] 111.com]# curl -x192.168.202.131:80 ‘http://111.com/admin.php?/alsjdf‘ -I
HTTP/1.1 403 Forbidden
Date: Wed, 11 Oct 2017 15:05:34 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[[email protected] 111.com]# curl -x127.0.0.1:80 ‘http://111.com/admin.php?/alsjdf‘ -I
HTTP/1.1 404 Not Found
Date: Wed, 11 Oct 2017 15:05:57 GMT
Server: Apache/2.4.27 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[[email protected] 111.com]# 
```






# - 扩展

- [ ] - 几种限制ip的方法 http://ask.apelearn.com/question/6519

参考文档来源:  http://jingyan.baidu.com/article/4b07be3c193d1648b380f3a9.html

1.  禁止访问某些文件/目录
增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:


2. 禁止访问某些指定的目录:(可以用  来进行正则匹配)

当然也可以写目录全局路径


3. 通过文件匹配来进行禁止,比如禁止所有针对图片的访问:
  

4. 针对URL相对路径的禁止访问









- [ ] 2. apache 自定义header http://ask.apelearn.com/question/830
1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers
/usr/local/apache2/bin/apachectl  -l
如果,显示有mode_headers.c  则是加载了这个模块,否则就需要重新编译一下了。
另外,如果你使用的是rpm安装的话,那肯定是已经加载了mod_headers这个模块的。

2.  在httpd.conf 中加入
    Header add MyHeader "Hello"
保存后,重启apache就可以了
双引号中的内容为自定义内容。当然这里的"MyHeader"也是可以自定义的。
3. 测试
curl  -I http://localhost
看是否显示有  MyHeader  "Hello"


nginx设置自定义header







- [ ] 3. apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
在APACHE的httpd.conf中,KeepAlive指的是保持连接活跃,类似于mysql的永久连接。换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。     

KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。    

所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论的问题了。    

如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么APACHE就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,那么APACHE中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。    

所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。    

其实,这和MySql的机制有点相似,KeepAlive相当于mysql_connect或mysql_pconnect,KeepAliveTimeOut相当于wait_timeout。    

以下是我的配置: KeepAlive On KeepAliveTimeout 3 考虑到我的网站上有不少的图片,所以将KeepAlive设为On,一般的页面两次请求间隔不会超过3秒,所以这样设置,至尽运行状况良好

转自:http://edu.cnzz.cn/NewsInfo/17275.aspx


以上是关于11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch的主要内容,如果未能解决你的问题,请参考以下文章

11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch

11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMat

11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch

11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch

11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch

11.25 配置防盗链;11.26 访问控制Directory;11.27 访问控制FilesMatch