LAMP架構php禁止解析、user_agent限定及php配置文件常規設置

11月20日任務php

11.28 限定某個目錄禁止解析phphtml

11.29 限制user_agentshell

11.30/11.31 php相關配置apache

 

禁止某目錄PHP解析

某些目錄能夠上傳圖片等文件,若是不設置禁止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

效果驗證

  • 在瀏覽中輸入直接路徑:111.com/upload/test.php,提示下載test.php,不解析php

 

查看對於的日誌記錄架構

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)"
  • curl測試時會直接返回php源代碼,不會解析php
[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

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>
...

效果驗證

  • 不指定user_agent,沒法訪問403
[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"
  • 指定user_agent 使用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://開頭)

PHP相關配置

查看PHP配置文件的位置

  1. 命令行模式
[root@localhost ~]# /usr/local/php/bin/php -i | grep -i "loaded configuration file"

Loaded Configuration File => /usr/local/php/etc/php.ini
  1. 在要訪問的目錄下建立一個包含phpinfo()的PHP文件,而後訪問該網頁便可

 

若是上述方法都沒法獲取到php.ini的位置信息,那麼多是系統安裝時未拷貝php.ini至安裝目錄。

安全函數設定 disable_functions

因爲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服務,使配置生效

瀏覽器訪問時就會獲得以下的錯誤

fun_error

時區 date.timezone

[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
# display_errors開發環境下默認爲On(開啓),生產環境最好設置爲Off,否則會暴露系統內部路徑
# 設置了Off後,向上文中display_functions禁掉phpinfo後瀏覽器訪問時就只顯示白頁
display_errors = Off

訪問頁面的空白效果

fun_error

  • 設置log_errors和error_log
# 關閉了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

網站的某個目錄下的網頁被黑,設置了open_basedir將起到隔離的做用,將目標限制在某一個目錄下

  1. php配置文件:針對網站下的全部目錄
[root@localhost ~]# vim /usr/local/php/etc/php.ini 
...
# 定位到該行,指定路徑
open_basedir = /data/wwwroot/111.com:/tmp
...
  1. 虛擬主機配置文件,限定在特定的虛擬主機下
[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/"
相關文章
相關標籤/搜索