4六、限制某個目錄禁止解析php、限制user_agent、php的相關配置

一、限制某個目錄禁止解析php:php

<Directory /data/wwwroot/www.123.com/upload>
       php_admin_flag engine off
   </Directory>

註釋:核心配置內容如上,curl測試時直接返回源代碼,並未解析;html

二、假設有一個目錄能夠上傳圖片,有可能被別有用心的人上傳了php(木馬類型)的文件,由於httpd加載了php的模塊,只要訪問php的請求就會解析,由於php有一些函數,一旦開放了上傳文件的權限,確定會被上傳一些木馬文件,一旦被執行,就能拿到服務器的root權限,或者被惡意篡改一些參數,致使服務器癱瘓;web

 有一臺服務器被入侵了,不知道是什麼緣由,也不知道入侵到什麼程度,只知道公司的數據庫泄露了,數據是一些電話號碼,黑客並無去刪除數據,由於他知道這個服務器的數據庫裏電話號碼天天都在增長,他能夠源源不斷獲取新的電話號碼,而後買給第三方來獲利;sql

分析:把一個新的號碼在這個服務器提交後,立刻就有人打電話過來了,證實,黑客得到電話號碼,到打電話給新用戶,這套體系已經徹底自動化,天天去抓電話號碼隊列,因此猜想網站的php程序存在漏洞,另外一種就是sql注入的漏洞(能夠把查詢的sql經過一些特殊的提交,提交到服務器上,服務器就會把這個sql語句轉換成正常的查詢,最終得到一些數據回來);可是sql注入漏洞,很容易修復,只要在網站提交的入口,增長一些特殊符號的過濾,就能徹底的阻斷sql注入的漏洞。shell

解決辦法:首先抓包,監控數據庫的查詢,寫一個死循環的腳本,每隔一分鐘抓一次查詢數據,抓完之後生成一個日誌文件;數據庫

查詢日記文件後,發現有一條sql查詢,和網站原生的查詢不同,經過日誌定位到了時間點,而後就去web服務器上查看時間點的訪問日誌,經過日誌查看到了一個很是特殊的請求,名字是以php結尾的文件,並且這個php文件是在圖片的目錄下進行訪問的,而後去查看這個php 文件,發現這個文件內容是一句話木馬,用來是獲取服務器的權限,至關於在服務器開了一個後門;這個問題產生的根本緣由,就是由於上傳圖片目錄並無禁止解析phpapache

sql注入:就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。[1] 好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊;vim

禁止php解析:配置文件以下:瀏覽器

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<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>
    #針對upload目錄下全部php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心內容:
      <FilesMatch (.*)\.php(.*)>           #增長FilesMatch後,這裏訪問upload目錄下Php都是403Forbidden;
       Order allow,deny
       Deny from all                       #若是不寫這個deny,訪問時會直接顯示源代碼;
      </FilesMatch>
   </Directory>

2:檢測配置文件是否有錯誤,並重啓欺負apache服務:安全

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

3:在根目錄下建立upload目錄,並新建一個php文件:

[root@localhost_002 extra]# cd /data/wwwroot/111.com/
[root@localhost_002 111.com]# mkdir upload
[root@localhost_002 111.com]# echo "123123" >upload/111.php

4:curl訪問時是403forbidden;

[root@localhost_002 111.com]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' -i
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 03:21:08 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Length: 223
Content-Type: text/html; charset=iso-8859-1

5:測試,這時候在虛擬主機配置文件裏註釋掉FilesMatch,而後看效果:

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
    #針對upload目錄下全部php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心內容:
      #<FilesMatch (.*)\.php(.*)>           #增長FilesMatch後,這裏訪問upload目錄下Php都是403Forbidden;
      # Order allow,deny
      # Deny from all                       #若是不寫這個deny,訪問時會直接顯示源代碼;
      #</FilesMatch>
   </Directory>

6:檢測配置文件錯誤,並從新加載apache文件:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

7:這時使用curl命令測試,會本身顯示源代碼,不太友好:

[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' 
123123

8:在瀏覽器訪問www.111.com/upload/111.php,也會提示下載這個文件,這是由於沒法訪問源代碼致使的;

9:這時再打開虛擬配置文件,去掉對FliesMatch的註釋:

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
    #針對upload目錄下全部php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心內容:
      <FilesMatch (.*)\.php(.*)>           #增長FilesMatch後,這裏訪問upload目錄下Php都是403Forbidden;
       Order allow,deny
       Deny from all                       #若是不寫這個deny,訪問時會直接顯示源代碼;
      </FilesMatch>
   </Directory>

10:檢測配置文件是否有錯誤,並從新加載配置文件:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

註釋:這時候再去訪問瀏覽器時會顯示403Forbidden,即也沒法看到源代碼的內容:

註釋:即便去訪問這個目錄下一個不存在的php文件,也會顯示403Forbidden:php解析操做主要是針對能夠寫的目錄,服務器安全:

註釋:通常網站可寫的目錄,都不須要php解析的,通常靜態文件存放的目錄(image目錄)頁不容許解析php的:

二、訪問控制:user_agent限制

擴展:cc攻擊,就是黑客經過肉雞去同時訪問某一個站點,超過服務器併發,就會致使宕機,沒有什麼特殊的,讓站點超過併發致使嚴重超負荷宕機,可是CC攻擊有一個規則的特徵,就是user_agent是一致的,好比同一個ip,同一個標識等,遇到這種user_agent頻繁訪問的狀況就能夠判定是CC攻擊了,咱們能夠經過限制它的user_agent來減輕服務器的壓力,只須要讓它正常訪問的狀態碼變爲403,用來減輕服務器的壓力,由於403僅僅是一個請求,帶寬耗費不會太大。

user_agent 是瀏覽器標識:curl   -A "123123" 指定user_agent

一、核心配置文件內容:

[root@localhost_002 extra]# cat httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<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針對user_agent
   <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]        #條件
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]        #條件
        RewriteRule  .*  -  [F]
    </IfModule>

註釋:在兩個條件中用OR作一個鏈接符,或者的意思,匹配第一條規則或者第二條規則;

若是不加OR是而且的意思,表示匹配第一條規則和第二條規則,兩條同時匹配才執行;

註釋:NC表示忽略大小寫,由於user_agent可能會是大寫(Mozilla/5.0),首字母大寫;

RewriteRule .*  - [F]表示Forbidden;

二、檢測配置文件並重啓服務:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

三、在訪問的時候,會顯示403 (Forbidden),這是由於顯示user_agent;

[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php'  -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:07 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:30 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

四、查看訪問日記(剛剛訪問的最後兩條日記):

[root@localhost_002 extra]# tail ../../logs/111.com-access_log 
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:11 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:13 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:05 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:07 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:27 +0800] "GET http://www.111.com/123.php HTTP/1.1" 403 216 "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:30 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:47:54 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:48:02 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"

五、測試是不是由於user_agent纔會被訪問:

自定義user_agent:   -A   自定義:

[root@localhost_002 extra]# curl -A "fenye" -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 07:09:18 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
[root@localhost_002 extra]# !tail
tail ../../logs/111.com-access_log 
192.168.149.135 - - [09/Oct/2018:15:06:51 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
127.0.0.1 - - [09/Oct/2018:15:09:18 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 200 - "-" "fenye"

註釋:curl命令是一個利用URL規則在命令行下工做的文件傳輸工具
-A ,指定user-agent,設置用戶代理髮送給服務器
-e ,指定referer,就是來源網址
-I ,僅僅查看它的狀態碼
-x ,在指定的端口上使用HTTP代理

三、php的相關配置

查看php的配置文件位置及相關參數

/usr/local/php/bin/php -i|grep -i "loaded configuration file" 
date.timezone 
disable_functions
eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close 
error_log, log_errors, display_errors, error_reporting
open_basedir
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

一、查看php的配置位置:

能夠經過瀏覽器訪問phpinfo找到配置文件的路徑:

也能夠經過 /usr/local/php/bin/php -i|grep "loaded configuration file"找到它的路徑,可是有些php -i是不許的,由於apache是調用了php的一個模塊,而php -i是php的一個程序,它和libphp5.so可能有關係也可能不要緊;

例如:有時候改動了php.ini文件,重啓了服務後仍是不生效,由於php -i找到的配置文件和在web上phpinfo找到phi.ini不是同一個,若是想找的準確一點,就須要在對應站點的目錄下建立一個phpinfo的php文件,在瀏覽器裏打開phpinfo裏看到纔是最準確的;

[root@localhost_002 111.com]# ls
123.php  admin.php  image  index.php  info.php  upload
[root@localhost_002 111.com]# cat index.php
<?
phpinfo();
?>
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php
php7.spec            php7.spec.in         php.gif              php.ini-development  php.ini-production   
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php.ini-development /usr/local/php7/etc/php.ini
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
這時候再用流浪器來訪問便可:

disable_functions    安全函數

eval 如以前提到的一句話木馬涉及到函數,若是把這個函數禁用了,即便上傳了一句話木馬也不會生效;

eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close 以上是比較危險的函數

二、那如何禁止了?        配置文件  /usr/local/php7/etc/pin.ini  ---->  搜索   disable

搜索diable

在disable_functions = 後添加(禁掉)一些函數:

[root@localhost_002 111.com]# vim /usr/local/php/etc/php.ini 
cat /usr/local/php/etc/php.ini |grep disable_functions
#搜索disable_functions =  這裏添加則可:
disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo,phpinfo

註釋:固然也能夠禁掉phpinfo,不少企業在生成環境中都會禁止掉,由於php涉及到服務器的不少配置信息相關,若是不當心上傳到線上,容易被黑客查到,實施攻擊;

三、從新加載配置文件:

[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful

四、在去瀏覽器訪問時,會顯示phpinfo被禁止掉了;

五、打開php配置文件:定義以下:    date.timezone            display_errors

一、定義date.timezone時區,如過不定義,有時候會有寫告警信息;

display_errors - On (On表示顯示 Off不顯示),意思是是否把錯誤信息顯示在瀏覽器上,這樣會把目錄給暴露出來,更改成display_errors = Off

[root@localhost_002 ~]# vim /usr/local/php7/etc/php.ini 
;刪除前面的分號,後面添加Asia/Shanghai或者Asia/Chongqing
date.timezone = Asia/Shanghai

; display_errors
;刪除前面的分號,將display_errors = On 改成  display_errors = Off
display_errors = Off
; separately from display_errors. PHP's default behavior is to suppress those

二、檢測配置文件是否錯誤,從新啓動apache服務;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

三、這是去瀏覽器再次訪問:www.111.com/index.php 會發現出現白頁,這是因打開display_errors參數;

四、配置錯誤日記(由於修改display_errors的不顯示),錯誤日記是頗有必要的;

log_errors = On             #定義錯誤日記開關(On表示打開;  Off表示關閉)

error_log = /tmp/php_error.log              #定義錯誤日記路徑;

error_reporting = E_ALL  定義日記級別,默認爲ALL,表示把全部的error都記錄下來,這是最不嚴謹的;

註釋:生產環境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices) 通知

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep log_errors
; log_errors
;打開錯誤日記開關;
log_errors = On           
; Set maximum length of log_errors. In error_log information about the source is
log_errors_max_len = 1024
;指定錯誤日日記的位置  /tmp/php_errors.log
error_log = /tmp/php_errors.log

五、檢測配置文件是否存在錯誤,並從新加載apache;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

六、再次用crul命令訪問下,會看到/tmp/目錄下生成了php_errors.log

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php
[root@localhost_002 ~]# cat /tmp/php_errors.log           #錯誤日記內容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
錯誤日記文件類型:
[root@localhost_002 ~]# ll /tmp/php_errors.log 
-rw-r--r-- 1 daemon daemon 145 10月  9 18:20 /tmp/php_errors.log

註釋:如上所示,會看到php_error.log的文件所屬主和組是daemon,而daemon實際是httpd的屬主;

因此php_error.log是以httpd這個進程的身份去運行的;

註釋:若是有時候定義的錯誤日記一直沒有生成的話,則要看看定義錯誤日記所在目錄有沒有寫權限(這個寫文件的人是daemon);

保險一點,就是在所在目錄下建立一個錯誤日記文件,而後賦予它777權限,這樣就不用擔憂httpd是否有寫權限了;

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep error_log
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log  
;error_log = syslog
[root@localhost_002 ~]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log

七、查看錯誤日記文件:  提示由於安全緣由,這個函數被禁掉了;

[root@localhost_002 ~]# cat /tmp/php_errors.log           #錯誤日記內容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2

三、安全相關參數open_basedir

如:一臺服務器上,運行了多個站點,其中有個站點的代碼有問題,被黑客攻擊了而且拿到了權限,黑客拿了權限會繼續往裏面滲透,就有可能滲透到其餘站點,致使其餘站點也被黑;

 多個站點  A網站在A目錄;   B網站在B目錄;    互相隔離;

一個站點  也能夠只把它限制在這個目錄,只能在這個目錄活動;

open_basedir  它是一個安全選項,限制不能串崗;只能給它限制在這個目錄下活動;

一、配置:打開配置文件:     /usr/local/php7/etc/php.ini

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep open_basedir
; open_basedir, if set, limits all file operations to the defined directory
open_basedir = /data/wwwroot/111.com:/tmp
;刪除分號,並添加目錄,多個目錄有冒號隔開;

擴展註釋:此處若是不當心寫錯了目錄,訪問是會報500的錯誤,查看錯誤日記提示沒有權限;

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 09 Oct 2018 10:51:21 GMT
[root@localhost_002 ~]# tail /tmp/php_errors.log 
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0

二、檢測配置文件是否有錯誤,並重啓apache;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

三、再次訪問,會顯示正常;

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 10:55:32 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

4:如果服務器上跑了多個站點,那怎麼來限制了???

應該是針對站點這些網站去作open_basedir,但php.ini是作不到,由於php.ini是針對全部站點的(這樣也沒意義);

但咱們能夠在虛擬主機裏去設置,apache的虛擬主機配置文件中針對不一樣的虛擬主機去設置open_basedir;

註釋:多個站點要在虛擬主機裏設置open_basedir時,須要每一個站點都指定,若是隻指定了一個站點,那其餘的站點也就沒辦法訪問了;

註釋:也能夠在虛擬主機配置文件設置error_log錯誤日記的位置及error_reporting日記級別等;

[root@localhost_002 abc.com]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    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
    php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"    #定義open_basedir;
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<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針對目錄進行
   php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"     #定義open_basedir
   <IfModule mod_rewrite.c>                                      #針對user_agent作限制(cc攻擊);
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]        #條件
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]        #條件
        RewriteRule  .*  -  [F]
    </IfModule>
   <Directory /data/wwwroot/111.com/upload>                  #某些目錄不解析php;
      php_admin_flag engine off
      <FilesMatch (.*)\.php(.*)>
       Order allow,deny
       Deny from all
     </FilesMatch>
   </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://www.111.com" local_ref
        SetEnvIfNoCase Referer "http://www.example.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>
   <IfModule mod_rewrite.c>                                      #重定向;                          
     RewriteEngine on 
     RewriteCond %{HTTP_HOST} !^www.111.com$  
     RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L]
   </IfModule>
    ErrorLog "logs/111.com-error_log" 
    CustomLog "logs/111.com-access_log" combined
</VirtualHost>

五、檢測配置文件是否有錯誤,從新加載配置文件;

[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl graceful

六、curl命令測試

虛擬主機裏第一個網站訪問;   www.123.com
[root@localhost_002 abc.com]# curl   -x 127.0.0.1:80 www.123.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:22 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
虛擬主機第二個網站訪問; www.111.com
[root@localhost_002 abc.com]# curl  -A "fenye" -x 127.0.0.1:80 www.111.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:42 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

註釋:由於第二個站點開了user_agent(禁止了curl標識),只能經過curl  -A "新標示" 的方式來訪問;

七、瀏覽器訪問;

第一個站點:www.123.com

第二個站點:www.111.com

 

擴展:

apache開啓壓縮 http://ask.apelearn.com/question/5528 apache2.2到2.4配置文件變動 http://ask.apelearn.com/question/7292 apache options參數 http://ask.apelearn.com/question/1051 apache禁止trace或track防止xss http://ask.apelearn.com/question/1045 apache 配置https 支持ssl http://ask.apelearn.com/question/1029

相關文章
相關標籤/搜索