1. 程式人生 > >apache限制某個目錄禁止解析php、apache禁止指定user_agent、php相關配置

apache限制某個目錄禁止解析php、apache禁止指定user_agent、php相關配置

日誌 httpd parse 臨時 usr cor 區分大小寫 直接 -i

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

某個目錄下禁止解析 php,這個很有用,我們做網站安全的時候,這個用的很多,比如
某些目錄可以上傳文件,為了避免上傳的文件有×××,所以我們禁止這個目錄下面的訪問解
析php。
<Directory /data/www/data>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
說明:php_admin_flag engine off這個語句就是禁止解析 php的控制語句,但只這樣配

置還不夠,因為這樣配置後用戶依然可以訪問php文件,只不過不解析了,但可以下載,用
戶下載php文件也是不合適的,所以有必要再禁止一下。

二:apache禁止指定user_agent

配置如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Firefox/4.0 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Tomato Bot/1.0 [NC]
RewriteRule . - [F]
</IfModule>
同樣是使用rewrite 模塊來實現限制指定user_agent,在本例中, RewriteRule .

- [F] 可
以直接禁止訪問,rewritecond用user_agent來匹配,Firefox/4.0 表示,只要 user_agent中
含有Firefox/4.0就符合條件,其中表示任意字符,NC 表示不區分大小寫,OR 表示或者,
連接下一個條件。假如我現在要把百度的搜索引擎限制掉,可以加一條這樣的規則:
RewriteCond %{HTTP_USER_AGENT} ^
Baiduspider/2.0 [NC]
RewriteRule .
- [F]
既然有了或者OR,那有沒有並且呢?你只要不寫OR 就是並且的意思

  1. 當最後一條規則加上OR之後,它應該是把所有的條件都算進去了,比如它會認為所有的user_agent都是符合條件的,所以所有的訪問都是403
  2. 如果不加OR, 那所有規則之間為“並且”,在本例中就是user_agent即含有chrome又含有360才算匹配。

三:php相關配置

在前面,我們已經拷貝了一個 php.ini文件到/usr/local/php/etc/目錄下面,這是我們已經
知道php.ini所在路徑在哪裏,但有時候我們並不知道 php.ini所在路徑,這時候就需要通過
命令來查一查在哪裏。
#/usr/local/php/bin/php -i |head
看那一行Loaded Configuration File -> /usr/local/php/etc/php.ini。如果這裏為None,那麽
就說明沒有加載到具體的php.ini。找到 php.ini後,用 vim打開它,發現很多行都是以;開頭
的,這個符號在php.ini中作為註釋符號,也就是說只要是以;開頭的行都是不起作用的。而
php.ini中常用的配置有如下:

(1) 配置 disable_function
disable_functions =
eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chg
rp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsock
open,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,p
roc_close
說明,在php中有非常多的函數,在這些函數中有一些是不×××全的,所以有必要把它
們禁v 0掉、。像exec,shell_exec都是在php代碼中執行 linux shell命令,很危險,要禁掉。

(2)配置error_log
如果你是php開發人員,那我相信你會經常遇到調試代碼的情況,作為一個運維人員我
們理應學會簡單的php 錯誤排查技能,其實php的錯誤跟 linux下其他服務都是一樣的,遇
到錯誤後要查看錯誤日誌,根據報錯信息來判斷錯誤的原因。那如何查看php的錯誤信息呢?
遇到錯誤時,我們訪問網站通常會顯示白頁,什麽都沒有,狀態碼是500。第一種情況,可
以直接把錯誤信息顯示在瀏覽器中,配置方法是,在 php.ini中找到display_error=on,重啟
apache服務後,刷新網頁,發現不再是白頁,而是具體的錯誤。這樣我們就可以根據錯誤來
調試php代碼了。這種情況適合臨時調試,但是這種情況不適合長期配置,因為所有錯誤都
會顯示在瀏覽器上,假如哪天 php程序員不小心寫錯一段代碼,而且沒測試直接上傳到服務
器上了,那麽我們的用戶就會直接看到這些錯誤,這樣是不合適的。所以還有第二種情況,
把錯誤信息輸出到一個日誌文件中,具體配置如下:
#vim /usr/local/php/etc/php.ini 加入或者更改
display_error=off
log_errors=on
error_log=/usr/local/php/logs/error.log
說明:該文件一開始是不存在的,為了避免權限問題不能自動生成該文件,我們可以先
創建該文件,並且修改權限為 777
error_reporting = E_ALL | E_STRICT
說明: 首先要把錯誤不再瀏覽器顯示,第二打開錯誤日誌開關,然後指定錯誤日誌的
路徑,最後是定義錯誤日誌的級別。配置完成後記得要重啟 apache服務,才會生效。

php的錯誤日誌級別 error_report
; E_ALL 所有錯誤和警告(除E_STRICT外)
; E_ERROR 致命的錯誤。腳本的執行被暫停。
; E_RECOVERABLE_ERROR 大多數的致命錯誤。
; E_WARNING 非致命的運行時錯誤,只是警告,腳本的執行不會停止。
; E_PARSE 編譯時解析錯誤,解析錯誤應該只由分析器生成。
; E_NOTICE 腳本運行時產生的提醒(往往是我們寫的腳本裏面的一些bug,比如某個變量沒有定義),這個錯誤不會導致任務中斷。
; E_STRICT 腳本運行時產生的提醒信息,會包含一些php拋出的讓我們要如何修改的建議信息。
; E_CORE_ERROR 在php啟動後發生的致命性錯誤
; E_CORE_WARNING 在php啟動後發生的非致命性錯誤,也就是警告信息
; E_COMPILE_ERROR php編譯時產生的致命性錯誤
; E_COMPILE_WARNING php編譯時產生的警告信息
; E_USER_ERROR 用戶生成的錯誤
; E_USER_WARNING 用戶生成的警告
; E_USER_NOTICE 用戶生成的提醒

(3)配置open_basedir
在 php中是有這個 open_basedir概念的,它的意思是,把執行php的用戶限定在指定的
路徑下,這樣通過權限縮小的方式達到安全目的。作為一個網站,其實我們只需要讓 php
用戶訪問到網站的代碼即可,沒有必要讓它去訪問其他目錄。那如何配置呢?
#vim /usr/local/php/etc/php.ini 加入或者更改
open_basedir = /dir1/:/dir2
說明:/dir1和/dir2 為我們允許php可以訪問的兩個目錄,同樣也可以是多個,目錄之
間用:分隔。一旦限定後,如果 php試圖去訪問除/dir1 和/dir2外的目錄下的文件時,就會報
錯了。錯誤類似於, Warning: file_exists() [function.file-exists]: open_basedir restriction in effect.
File(../123.php) is not within the allowed path(s):

除了在php.ini中定義 open_basedir外,其實我們還可以在 apache的配置文件中定義,
因為一個apache下可能有多個站點,我們要針對不同的站點限定不同的 open_basedir,配置
如下。
#vim httpd.conf 或者虛擬主機配置文件,加入
php_admin_value open_basedir "/dir1/:/dir2/"

php.ini詳解 http://legolas.blog.51cto.com/2682485/493917

apache限制某個目錄禁止解析php、apache禁止指定user_agent、php相關配置