php open_basedir保險與效能的取捨

來源:互聯網
上載者:User
php open_basedir安全與效能的取捨

open_basedir 嚴重影響PHP I/O效能


這是昨天看到的一篇文章,看完後,我針對伺服器等做了一下測試,確實有影響。畢竟open_basedir在每一次require,include以及判斷檔案等的時候,都要先判斷是否在可執行目錄內。所以。。。效能就會下降(如果是用架構的,可能效能會更差一點),如果是自己的機器,一般也可以通過設定檔案目錄許可權,來防止這種情況發生【linux可以指定使用者、使用者組。windows可以設定目錄的所有者(當時在win下我就最煩這個,因為需要為每個虛擬機器主機添加一個使用者,再指定許可權,然後再到目錄上設定使用者)】

下面就是我看到的文章的內容:

今天在做項目的時候發現 沒幾行語句 竟然耗費了0.04秒

十分讓我吃驚.隨後進行跟蹤 得知就在I/O讀寫的時候最費時間 一個is_file竟然費了0.003秒

後來讓我百思不得其解 Google也沒有任何答案.

然後我又把項目放到另外一個電腦上 發現速度直線上升 從以前的0.04秒變成了0.007秒左右.

我很納悶 難道我的本本就這麼差勁不應該啊

經過我的比較 我發現了 在我機器上的這個項目的虛擬機器主機中 設定了open_basedir.

大家都知道 這個對於虛擬機器主機來說是必不可少的..

但是後來我又進行測試一遍 難道真的是這樣嗎

我的測試代碼非常簡單:

PHP代碼
01.$time = microtime(true);???
02.is_file('1.html');???
03.echo microtime(true) - $time;???

我的弄了一個空的1.html檔案 這個檔案是在目前的目錄絕對存在的.

我建立了一個虛擬機器主機 然後設定了一下open_basedir.

得到的結果是0.0018570423126221左右

然後我進apache的設定檔 把open_basedir刪除以後

得到的結果是5.0067901611328E-5 這個結果小到PHP中的小數點都不能表示了

(注:以上結果都是多次運行緩衝後的結果 因為is_file的結果會被緩衝的)

現在我終於明白了 為啥虛擬機器主機那些探針中 I/O的效能都那麼小的原因了..

杯具啊..


各位也可以測試。。實測如此。


----------------------
取消該設定,或者 ../:./:/tmp:../../?
----------------------

?

如下是php.ini中的原文說明以及預設配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .
open_basedir可將使用者訪問檔案的活動範圍限制在指定的地區,通常是其家目錄的路徑,也
可用符號"."來代表目前的目錄。注意用open_basedir指定的限制實際上是首碼,而不是目錄名。
舉例來說: 若"open_basedir = /dir/user", 那麼目錄 "/dir/user" 和 "/dir/user1"都是
可以訪問的。所以如果要將訪問限制在僅為指定的目錄,請用斜線結束路徑名。例如設定成:
"open_basedir = /dir/user/"

open_basedir也可以同時設定多個目錄, 在Windows中用分號分隔目錄,在任何其它系統中用
冒號分隔目錄。當其作用於Apache模組時,父目錄中的open_basedir路徑自動被繼承。

有三種方法可以在Apache中為指定的使用者做獨立的設定:

(a) 在Apache的httpd.conf中Directory的相應設定方法:

php_admin_value open_basedir /usr/local/apache/htdocs/
#設定多個目錄可以參考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/


(b) 在Apache的httpd.conf中VirtualHost的相應設定方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#設定多個目錄可以參考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/

(c) 因為VirtualHost中設定了open_basedir之後, 這個虛擬使用者就不會再自動繼承php.ini
中的open_basedir設定值了,這就難以達到靈活的配置措施, 所以建議您不要在VirtualHost
中設定此項限制. 例如,可以在php.ini中設定open_basedir = .:/tmp/, 這個設定表示允許
訪問目前的目錄(即PHP指令檔所在之目錄)和/tmp/目錄.

請注意: 若在php.ini所設定的上傳檔案臨時目錄為/tmp/, 那麼設定open_basedir時就必須
包含/tmp/,否則會導致上傳失敗. 新版php則會提示"open_basedir restriction in effect"
警告資訊, 但move_uploaded_file()函數仍然可以成功取出/tmp/目錄下的上傳檔案,不知道
這是漏洞還是新功能.

針對ShopEx472版本的配置:

open_basedir = "D:/Server;../catalog;../include;../../home;../syssite;../templates;../language;../../language;../../../language;../../../../language"

網站安全與效能似乎是矛與盾的關係。對於一個php網站來說,尤其難以取捨。舉個最簡單的例子:php設定檔的open_basedir將 PHP 所能開啟的檔案限制在指定的分類樹,包括檔案本身。本來這對於網站的安全是十分有利的;但據筆者從網上擷取的資料來看,open_basedir會對php操作io的效能產生很大的影響。研究資料表明,配置了php_basedir的指令碼io執行速度會比沒有配置的慢10倍甚至更多!

?

起初,我也不太相信這個結果,不過測試資料卻說服我承認這個觀點。

建立一個簡單的指令碼:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function microtime_float()

{

????list($usec, $sec) = explode(" ", microtime());

????return ((float)$usec + (float)$sec);

}

??

$time_start = microtime_float();

??

is_file('1.html');? //判斷目前的目錄是否有1.html這個檔案

$time_end = microtime_float();

$time = $time_end - $time_start;

??

echo "Did is_file in $time seconds\n";

?>

對於open_basedir的測試結果
0.0006 / 5.0E-5
差距是相當大的,不過聰明的朋友應該注意到,筆者的網站配置了open_basedir,相對與這樣的效能損失來說,我寧願選擇犧牲效能,換取安全,您的選擇呢?不用猜,您可能和我的選擇一致啦~畢竟伺服器安全更重要些。

小提示:如何配置open_basedir
當一個指令碼試圖用例如 fopen() 或者 gzopen() 開啟一個檔案時,該檔案的位置將被檢查。當檔案在指定的分類樹之外時 PHP 將拒絕開啟它。所有的符號串連都會被解析,所以不可能通過符號串連來避開此限制。

特殊值 . 指明指令碼的工作目錄將被作為基準目錄。但這有些危險,因為指令碼的工作目錄可以輕易被 chdir() 而改變。

在 httpd.conf 檔案中中,open_basedir 可以像其它任何配置選項一樣用“php_admin_value open_basedir none”的方法關閉(例如某些虛擬機器主機中)。

在 Windows 中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為 Apache 模組時,父目錄中的 open_basedir 路徑自動被繼承。

用 open_basedir 指定的限制實際上是首碼,不是目錄名。也就是說“open_basedir = /dir/incl”也會允許訪問“/dir/include”和“/dir/incls”,如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:“open_basedir = /dir/incl/”。

?

?

?

?

?

?

?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.