1. 程式人生 > >LAMP架構php禁止解析、user_agent限定及php配置檔案常規設定

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

11月20日任務

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

11.29 限制user_agent

11.30/11.31 php相關配置

 

禁止某目錄PHP解析

某些目錄可以上傳圖片等檔案,如果不設定禁止PHP解析,上傳的PHP檔案如果被執行可能被某些人獲取到系統許可權,從而造成伺服器機密內容的洩露,因此設定這些目錄下的PHP檔案禁止解析就十分重要。

建立測試目錄和檔案

[[email protected] ~]# mkdir  /data/wwwroot/111.com/upload
[[email protected] ~]# vim /data/wwwroot/111.com/upload/test.php
[
[email protected]
~]# cat !$ cat /data/wwwroot/111.com/upload/test.php <?php echo "test"; ?>

設定php禁止解析

[[email protected] ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf 
# 在虛擬主機內新增下列程式碼禁止解析PHP
<Directory /data/wwwroot/www.111.com/upload>
    php_admin_flag engine off
</Directory>

重啟apache服務

[[email protected] ~]# /usr/local/apache/bin/apachectl -t
Syntax OK
[[email protected] ~]# /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
[[email protected] ~]# curl -x 192.168.65.133:80 111.com/upload/test.php
<?php
echo "test"
?>

對應日誌記錄

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模組

# 檢視是否已經開啟,未開啟需要將開頭的#註釋刪除
[[email protected] ~]# cat /usr/local/apache/conf/httpd.conf | grep -i rewrite
LoadModule rewrite_module modules/mod_rewrite.so

修改虛擬主機配置檔案,新增如下程式碼

[[email protected] ~]# 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
[[email protected] ~]# 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,成功訪問
[[email protected] ~]# 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. 命令列模式
[[email protected] ~]# /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資訊,造成損失。測試環境可以不禁

配置如下:

[[email protected] ~]# 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

[[email protected] ~]# vim /usr/local/php/etc/php.ini 

# 定位到date.timezone行,刪除開頭的註釋符,並在後面新增如下程式碼
date.timezone = Asia/Shanghai
...

儲存後重啟apache服務生效配置

設定時區前後日誌記錄時間的變化

# 設定前
[[email protected] ~]# 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許可權。

  • 測試效果
[[email protected] ~]# vim /data/wwwroot/111.com/test.php
//輸入如下程式碼,該程式碼是錯誤的,日誌將會記錄語法錯誤
<?php
echo 111;
test

檢視是否在指定的路徑生成了錯誤日誌

[[email protected] ~]# 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
[[email protected] ~]# 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

對應錯誤日誌記錄

[[email protected] ~]# 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配置檔案:針對網站下的所有目錄
[[email protected] ~]# vim /usr/local/php/etc/php.ini 
...
# 定位到該行,指定路徑
open_basedir = /data/wwwroot/111.com:/tmp
...
  1. 虛擬主機配置檔案,限定在特定的虛擬主機下
[[email protected] ~]# 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/"