配置防盜鏈、 訪問控制Directory 、訪問控制FilesMatch

5月31日任務

11.25 配置防盜鏈
11.26 訪問控制Directory
11.27 訪問控制FilesMatch
擴展
幾種限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定義header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556javascript

 

配置防盜鏈目錄概要

  • 經過限制referer來實現防盜鏈的功能
  • 配置文件增長以下內容
Directory針對目錄進行
  <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|png)」>                      //定義規則
           Order Allow,Deny                                                                   //定義訪問控制
           Allow from env=local_ref                                                        
       </filesmatch>
   </Directory>

防盜鏈

  • 防盜鏈的定義
  • 此內容不在本身服務器上,而經過技術手段,繞過別人放廣告有利益的最終頁,直接在本身的有廣告有利益的頁面上向最終用戶提供此內容。 經常是一些名不見經傳的小網站來盜取一些有實力的大網站的地址(好比一些音樂、圖片、軟件的下載地址)而後放置在本身的網站中,經過這種方法盜取大網站的空間和流量。
  • 爲何會產生盜鏈
  • 通常瀏覽有一個重要的現象就是一個完整的頁面並非一次所有傳送到客戶端的。若是請求的是一個帶有許多圖片和其它信息的頁面,那麼最早的一個Http請求被傳送回來的是這個頁面的文本,而後經過客戶端的瀏覽器對這段文本的解釋執行,發現其中還有圖片,那麼客戶端的瀏覽器會再發送一條Http請求,當這個請求被處理後那麼這個圖片文件會被傳送到客戶端,而後瀏覽器會將圖片安放到頁面的正確位置,就這樣一個完整的頁面也許要通過發送多條Http請求才可以被完整的顯示。基於這樣的機制,就會產生一個問題,那就是盜鏈問題:就是一個網站中若是沒有起頁面中所說的信息,例如圖片信息,那麼它徹底能夠將這個圖片的鏈接到別的網站。這樣沒有任何資源的網站利用了別的網站的資源來展現給瀏覽者,提升了本身的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站爲了避免增長成本而擴充本身站點內容,常常盜用其餘網站的連接。一方面損害了原網站的合法利益,另外一方面又加劇了服務器的負擔。

配置防盜鏈

  • 打開虛擬主機配置文件
  • 須要添加的配置文件
Directory針對目錄進行
   <Directory /data/wwwroot/www.111.com>                                    //用於定義做用於哪一個目錄,配置防盜鏈,就是定義本站點
        SetEnvIfNoCase Referer 「http://www.111.com」 local_ref           //定義Referer白名單
        SetEnvIfNoCase Referer 「http://aaa.com」 local_ref                   //定義白名單
        SetEnvIfNoCase Referer 「^$」 local_ref                                       //定義空的Referer頁面爲白名單
        <filesmatch 「.(txt|doc|mp3|zip|rar|jpg|gif|png)」>                      //定義規則,這裏的filesmatch中f 和 m 能夠大寫能夠小寫
            Order Allow,Deny                                                                   //定義訪問控制,order用來定義訪問順序
            Allow from env=local_ref                                                        
        </filesmatch>
    </Directory>
  • 未更改前的配置文件
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</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>
        <Directory /data/wwwroot/www.111.com>
        SetEnvIfNoCase Referer "http://www.111.com" local_ref
        SetEnvIfNoCase Referer "http://111.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>
 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>
  • 更改後的配置文件,並將空的Referer頁面爲白名單 註釋掉
    • 將# SetEnvIfNoCase Referer "^$" local_ref
[root@yong-02 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf


<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</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>
        <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://www.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/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
  • 檢查配置文件是否存在語法錯誤,並從新加載配置文件
[root@yong-02 111.com]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yong-02 111.com]# /usr/local/apache2/bin/apachectl graceful
  • 用瀏覽器訪問111.com/images/baidu.png圖片,會顯示Forbidden

  • 這時在論壇建立一個帖子,將鏈接放進帖子中,再去訪問,會看到仍是Forbidden,這是由於Referer是ask.apelearn.com
  • 如果想在帖子中正常訪問圖片,能夠將ask.apelearn.com加入到白名單中
SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
  • 而後檢查配置文件是否存在語法錯誤,並從新加載配置文件
[root@yong-02 111.com]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yong-02 111.com]# /usr/local/apache2/bin/apachectl graceful
  • 這時再來在帖子中訪問圖片,會看到正常訪問

  • 如果想要直接就能夠在瀏覽器中訪問,則只須要去虛擬主機配置文件中打開空的Referer
[root@yong-02 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

更改前,去除前面的註釋符
 # SetEnvIfNoCase Referer "^$" local_ref
更改後
SetEnvIfNoCase Referer "^$" local_ref
  • 而後檢查配置文件語法錯誤,並重啓配置文件
  • 這時候在瀏覽器中訪問訪問圖片就會正常顯示

用curl測試

  • 用curl命令去訪問圖片
[root@yong-02 111.com]# curl -x127.0.0.1:80 111.com/images/baidu.png -I
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:01:30 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Wed, 30 May 2018 13:46:34 GMT
ETag: "a46d-56d6c9435c280"
Accept-Ranges: bytes
Content-Length: 42093
Content-Type: image/png
  • 固然也能夠用curl去模擬Referer,使用 -e 參數指定Referer
[root@yong-02 111.com]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/images/baidu.png -I
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 15:04:21 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[root@yong-02 111.com]# curl -e "http://111.com/123.php" -x127.0.0.1:80 111.com/images/baidu.png -I
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:04:41 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Wed, 30 May 2018 13:46:34 GMT
ETag: "a46d-56d6c9435c280"
Accept-Ranges: bytes
Content-Length: 42093
Content-Type: image/png
  • curl -e 格式
    • curl -e "http://"

 

訪問控制 – Directory目錄概要

  • 核心配置文件內容
<Directory /data/wwwroot/111.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>
  • curl測試狀態碼爲403則被限制訪問了

訪問控制

  • 打開虛擬主機配置文件
  • Order,用來定義順序,是先deny,仍是allow
    • 如果先deny,就先執行deny的語句
    • 如果先allow,就先執行allow的語句
    • 特殊性:
      • 無論IP是否匹配到,它都會從頭至尾執行完
[root@yong-02 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

將代碼放在防盜鏈代碼上面,防止衝突
  <Directory /data/wwwroot/111.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>
  • 建立一個admin目錄,並新建一個index.php文件,內容爲121212
[root@yong-02 111.com]# mkdir admin
[root@yong-02 111.com]# cd admin/
[root@yong-02 admin]# touch index.php
[root@yong-02 admin]# echo "12113414123">index.php
[root@yong-02 admin]# cat index.php 
12113414123
  • 檢查語法錯誤,並從新加載配置文件
[root@yong-02 admin]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yong-02 admin]# /usr/local/apache2/bin/apachectl graceful
  • 限制的原 IP
  • curl -x127.0.0.1:80 111.com/admin/index.php -I
    • 127.0.0.1是目標 IP ,而要訪問的IP,也要使用127.0.0.1去訪問,最終就是目標IP和原IP是同一個IP,本身和本身通訊,限制IP是 原 IP
    • -x指定的是目標IP
[root@yong-02 admin]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:21:22 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
  • 在更換目標IP,那麼原IP也會跟着變化
[root@yong-02 admin]# curl -x192.168.180.135:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 15:24:48 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
  • 瀏覽器訪問111.com/admin/index.php會顯示forbidden

  • 訪問控制是用目錄的形式來作的,首先規定一個目錄訪問到哪裏去的(目錄必須使用絕對路徑),而後是Oerder,控制的對象就是來源IP

訪問控制 – FilesMatch目錄概要

  • 核心配置文件內容
<Directory /data/wwwroot/www.123.com>         //功能做用目錄
    <FilesMatch  "admin.php(.*)">            //針對admin.php(.*)這個類型的文件,進行控制
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>

訪問控制 – FilesMatch

  • 訪問控制,除了目錄形式,仍是文件名去匹配(或連接)
  • 打開虛擬主機配置文件
    • 首先定義一個Directory,而後在下面在定義一個FilesMatch
[root@yong-02 admin]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 

 <Directory /data/wwwroot/111.com>
        <FilesMatch "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        </FilesMatch>
    </Directory>
  • 檢查語法錯誤,並從新加載配置文件
[root@yong-02 admin]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yong-02 admin]# /usr/local/apache2/bin/apachectl graceful
  • 測試
這裏沒有對admin目錄作任何限制,作的FilesMatch跟這個不匹配,沒有遇到控制語句,因此訪問是404
[root@yong-02 admin]# curl -x192.168.180.135:80 111.com/admin/fasdfasdf -I
HTTP/1.1 404 Not Found
Date: Thu, 31 May 2018 15:36:57 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1



有特殊符號須要用 」 單引號括起來
[root@yong-02 111.com]# curl -x192.168.180.135:80 'http://111.com/admin.php?fasdfasdf' -I
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 15:44:16 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[root@yong-02 111.com]# curl -x127.0.0.1:80 'http://111.com/admin.php?fasdfasdf' -I
HTTP/1.1 404 Not Found
Date: Thu, 31 May 2018 15:44:45 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

總結

  • Directory和FilesMatch 功能是同樣的,只不過有時僅僅想針對一個訪問的連接去作控制,那麼再去控制目錄則不太合適,FilesMatch能夠知足一些比較個性化的需求
相關文章
相關標籤/搜索