11月20日任務php
11.28 限定某個目錄禁止解析phphtml
11.29 限制user_agentshell
11.30/11.31 php相關配置apache
某些目錄能夠上傳圖片等文件,若是不設置禁止PHP解析,上傳的PHP文件若是被執行可能被某些人獲取到系統權限,從而形成服務器機密內容的泄露,所以設置這些目錄下的PHP文件禁止解析就十分重要。vim
建立測試目錄和文件瀏覽器
[root@localhost ~]# mkdir /data/wwwroot/111.com/upload [root@localhost ~]# vim /data/wwwroot/111.com/upload/test.php [root@localhost ~]# cat !$ cat /data/wwwroot/111.com/upload/test.php <?php echo "test"; ?>
設置php禁止解析安全
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf # 在虛擬主機內添加下列代碼禁止解析PHP <Directory /data/wwwroot/www.111.com/upload> php_admin_flag engine off </Directory>
重啓apache服務服務器
[root@localhost ~]# /usr/local/apache/bin/apachectl -t Syntax OK [root@localhost ~]# /usr/local/apache/bin/apachectl graceful
查看對於的日誌記錄架構
192.168.65.1 - - [...:19:14:51 +0800] "GET /upload/test.php HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 OPR/49.0.2725.64 (Edition Baidu)"
[root@localhost ~]# curl -x 192.168.65.133:80 111.com/upload/test.php <?php echo "test" ?>
對應日誌記錄curl
192.168.65.133 - - [...:19:15:52 +0800] "HEAD HTTP://111.com/upload/test.php HTTP/1.1" 200 - "-" "curl/7.29.0"
user_agent能夠理解爲瀏覽器標識;
CC攻擊:黑客利用大量被控制的計算機(肉雞)來在同一時間對某個網站進行訪問,致使該網站訪問量超出負荷,讓正經常使用戶沒法訪問。訪問日誌中共同的特色是同一時間大量相同的訪問網址和user_agent。
因爲使用了mod_rewrite模塊,所以必須打開主配置文件內的rewrite模塊
# 查看是否已經開啓,未開啓須要將開頭的#註釋刪除 [root@localhost ~]# cat /usr/local/apache/conf/httpd.conf | grep -i rewrite LoadModule rewrite_module modules/mod_rewrite.so
修改虛擬主機配置文件,添加以下代碼
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf ... <IfModule mod_rewrite.c> RewriteEngine on # 接下設置匹配條件 # OR鏈接上下2個條件RewriteCond; # NC表示忽略大小寫 RewriteCond %{HTTP_USER_AGENT} .*curl.*[NC,OR] RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] # 配置匹配後的規則,F表示Forbidden RewriteRule .* - [F] </IfModule> ...
[root@localhost ~]# curl -x 127.0.0.1:80 111.com/test.jpg -I HTTP/1.1 403 Forbidden Date: ..., ... 11:57:19 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Content-Type: text/html; charset=iso-8859-1
對應日誌記錄
127.0.0.1 - - [...:19:57:19 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 403 - "-" "curl/7.29.0"
curl -A
來指定user_agent,成功訪問[root@localhost ~]# curl -A "test" -x 127.0.0.1:80 111.com/test.jpg -I HTTP/1.1 200 OK Date: ..., ... 12:00:47 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Last-Modified: ..., ... 13:20:20 GMT ETag: "18652-5612a0725ed00" Accept-Ranges: bytes Content-Length: 99922 Content-Type: image/jpeg
對應的日誌記錄
127.0.0.1 - - [...:20:00:47 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 200 - "-" "test"
curl -x 省略host
curl -I 只查看狀態碼
curl -e 指定referer(必須http://開頭)
[root@localhost ~]# /usr/local/php/bin/php -i | grep -i "loaded configuration file" Loaded Configuration File => /usr/local/php/etc/php.ini
若是上述方法都沒法獲取到php.ini的位置信息,那麼多是系統安裝時未拷貝php.ini至安裝目錄。
因爲phpinfo會顯示出服務器內LAMP架構內的不少軟件的配置文件等重要文件的信息,因此在生產環境下最好禁掉,防止被黑客獲取到系統內部php信息,形成損失。測試環境能夠不由。
配置以下:
[root@localhost ~]# vim /usr/local/php/etc/php.ini # 咱們能夠禁止php語言內的一部分功能函數解析,這些函數易被黑客用做獲取本機信息的工具 # 方法:定位到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 ...
保存php配置文件後重啓apache服務,使配置生效
瀏覽器訪問時就會獲得以下的錯誤
[root@localhost ~]# vim /usr/local/php/etc/php.ini # 定位到date.timezone行,刪除開頭的註釋符,並在後面添加以下代碼 date.timezone = Asia/Shanghai ...
保存後重啓apache服務生效配置
設置時區先後日誌記錄時間的變化
# 設置前 [root@localhost ~]# tail -n 2 /tmp/php_errors.log [... 13:19:34 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4 # 設置後 [... 21:22:01 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4
# display_errors開發環境下默認爲On(開啓),生產環境最好設置爲Off,否則會暴露系統內部路徑 # 設置了Off後,向上文中display_functions禁掉phpinfo後瀏覽器訪問時就只顯示白頁 display_errors = Off
訪問頁面的空白效果
# 關閉了display_errors後須要設置log_errors和error_log用來記錄錯誤日誌 log_errors = on error_log = /tmp/php_error.log #取消註釋,並設置路徑
定義定義日誌的級別
# 開發版默認的是E_ALL,這是最低級的,全部級別的錯誤信息都會被記錄,這裏使用的是第二個值:E_ALL & ~E_NOTICE ; Common Values: ; E_ALL (Show all errors, warnings and notices including coding standards.) ; E_ALL & ~E_NOTICE (Show all errors, except for notices) ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ; Development Value: E_ALL ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT ; http://php.net/error-reporting error_reporting = E_ALL & ~E NOTICE
若是計劃定義的日誌始終未生成,多是由於httpd進程用戶對該目錄沒有w權限。爲了保險起見,能夠先建立日誌文件,並賦予777權限。
[root@localhost ~]# vim /data/wwwroot/111.com/test.php //輸入以下代碼,該代碼是錯誤的,日誌將會記錄語法錯誤 <?php echo 111; test
查看是否在指定的路徑生成了錯誤日誌
[root@localhost ~]# ls -l /tmp/php_errors.log -rw-r--r--. 1 daemon daemon 399 12月 26 20:54 /tmp/php_errors.log
使用curl命令進行測試(瀏覽器沒法處理錯誤的PHP文件)
# curl命令返回的狀態碼爲500 [root@localhost ~]# curl -A "test" -x127.0.0.1:80 http://111.com/test.php -I HTTP/1.0 500 Internal Server Error Date: ..., ... 13:18:25 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 X-Powered-By: PHP/5.6.30 Connection: close Content-Type: text/html; charset=UTF-8
對應錯誤日誌記錄
[root@localhost ~]# tail -n 1 /tmp/php_errors.log [... 21:32:01 Asia/Shanghai]PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4
網站的某個目錄下的網頁被黑,設置了open_basedir將起到隔離的做用,將目標限制在某一個目錄下
[root@localhost ~]# vim /usr/local/php/etc/php.ini ... # 定位到該行,指定路徑 open_basedir = /data/wwwroot/111.com:/tmp ...
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf # 能夠針對不一樣的虛擬主機限制不一樣的open_basedir # 在某個虛擬主機下設置 # php_admin_value能夠配置php.ini內的配置:如error_log等 php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"