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請求才能夠被完整的顯示。基於這樣的機制,就會產生一個問題,那就是盜鏈問題:就是一個網站中如果沒有起頁面中所說的信息,例如圖片信息,那麼它完全可以將這個圖片的連接到別的網站。這樣沒有任何資源的網站利用了別的網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站爲了不增加成本而擴充自己站點內容,經常盜用其他網站的鏈接。一方面損害了原網站的合法利益,另一方面又加重了服務器的負擔。

- 配置防盜鏈
- 先打開虛擬主機配置文件
```
[root@localhost 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 p_w_picpath/gif  "access plus 1 days"
    ExpiresByType p_w_picpath/jpeg "access plus 24 hours"
    ExpiresByType p_w_picpath/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                 
```
- 然後檢查配置文件,重新加載
```
[root@localhost ~]# cd /data/wwwroot/111.com/
[root@localhost 111.com]# ls
123.php  baidu.png  index.php
[root@localhost 111.com]# mv baidu.png qq.png
[root@localhost 111.com]# ls
123.php  index.php  qq.png
[root@localhost 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@localhost 111.com]# 
```
- 再用windows訪問下111.com/qq.png 
- ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20171011/214120293.png?p_w_picpathslim)
- 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 用瀏覽器訪問也是可以的
```
[root@localhost 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@localh 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: p_w_picpath/png

[root@localhost 111.com]# 
```
-  ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20171011/214744107.png?p_w_picpathslim)
-  crul -e用來指定它的 rerferer 也可以模擬referer
-  用curl 來模擬查看 referer情況模擬referer的 需用用到-e選項,模擬的地址需要用“”雙引號括起來
```
[root@localhost 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

[root@localhost 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: p_w_picpath/png

[root@localhost 111.com]#

[root@localhost 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      
```
- 檢查語法,重新加載
```
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl graceful
```
- 在111.com 目錄下創建admin admin目錄下創建index.php 內容爲121212
```
[root@localhost 111.com]# ls
123.php  admin  index.php  qq.png
[root@localhost 111.com]# ls admin/
index.php
[root@localhost 111.com]# cat admin/index.php
121212
[root@localhost 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都無法進行


- 再來訪問下是可以的
```
[root@localhost 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

[root@localhost 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
121212
[root@localhost 111.com]# 
```
- 如果把源ip換掉,把目標ip一變 源ip也就跟着變
```
[root@localhost 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>
[root@localhost 111.com]# 

[root@localhost 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

[root@localhost 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
121212
[root@localhost 111.com]# 

```
- 查看日誌文件
```
[root@localhost 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"
[root@localhost 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
-- 插入 --  
```
- 檢查 重新加載
```
[root@localhost 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost 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,可以滿足一些比較個性化的需求

```
[root@localhost 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

[root@localhost 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

[root@localhost 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

[root@localhost 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章