首頁  >  文章  >  後端開發  >  淺談php open_basedir安全與效能的取捨

淺談php open_basedir安全與效能的取捨

高洛峰
高洛峰原創
2016-11-29 11:11:141114瀏覽

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

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

建立一個簡單的腳本:

<?php
functionmicrotime_float()
{
    list($usec,$sec) =explode(" ", microtime());
    return((float)$usec+ (float)$sec);
}
 
$time_start= microtime_float();
 
is_file(&#39;1.html&#39;); //判断当前目录是否有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/」。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn