簡體   English   中英

識別PHP中的根目錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM