[英]Recognizing the root dir in PHP
我正在編寫一個PHP函數,它將刪除傳遞給它的目錄中的所有文件(並最終將其擴展為遞歸刪除)。 為了安全起見,我想確保通過錯誤或其他原因,如果傳入的目錄是根目錄,我不會嘗試刪除任何內容。
文件權限應在很大程度上保護我,但以防萬一,尤其是如果我將其擴展為遞歸刪除時,我只想采取這一額外步驟。
作為復雜因素,此代碼可能在Windows機器或linux機器上運行,因此根目錄可能看起來像“ C:\\”或“ /”。 我假設還有其他真正引用根的方法,可能是'c:\\ temp ..'。
那么,PHP是否有可靠的方法來識別目錄規范解析為文件系統的根目錄?
闡述...
我正在為一個Web應用程序編寫PHPUnit測試,並且試圖創建一個框架,在該框架中可以在運行測試之前備份應用程序的狀態,然后再進行測試還原。 該應用程序允許用戶上傳文件。 根據文件的不同,將其復制到幾個可能的目錄之一。
要保存和恢復應用程序的狀態,需要將這些目錄復制到某個位置,然后運行測試,然后刪除目錄並從備份中獲取其文件。
這些目錄的位置在一台機器上可能會有所不同,我知道有些人將它們放在Web應用程序之外。 測試可以讀取一個配置文件,該文件提供給定計算機的那些目錄的位置。
如果我不將所有這些目錄都限制為特定的目錄樹,則很難進行管理。 如果我確實將這些目錄限制為特定的目錄樹,那么某些人將不得不重新配置其計算機。
您應該有一個已定義的根文件夾,也永遠不要放在上面。 根文件夾不是唯一可以造成嚴重損壞的文件夾。
編輯。
盡管我仍然主張使用某種類型的jail,但我想您可以通過剝離所有驅動器字母並將\\轉換為/來識別根文件夾。 這樣,根文件夾將始終為單個/。
function isRootFolder($dirpath) {
list($drive, $path) = explode(':', str_replace('\\', '/', $dirpath), 2);
return $path == '/';
}
試試看,這個功能:
function is_root_dir($path)
{
$clean_path = realpath($path);
if($clean_path == '/' || preg_match('/[a-z]:\\/i', $clean_path))
{
return true;
}
else
{
return false;
}
}
它未經測試,我只是在這里的編輯器中編寫的。 realpath()解析路徑,遵循符號鏈接並解決諸如:c:\\ temp .. == c:\\
編輯:最后,您應該遵循nikc給您的建議,定義一個可以安全刪除的目錄列表。
我用這個:
if (dirname($target)==$target) { // you're at the root dir
(可在Microsoft和其他所有產品之間移植)
C。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.