在PHP 中維護目錄完整性:在允許路徑的同時防止目錄遍歷
在Web 開發領域,保護用戶輸入免受惡意嘗試是非常重要的最重要的。在 PHP 中處理路徑時,特別是在容納相對路徑的同時嘗試限制目錄遍歷時,就會出現這樣的問題。
考慮以下場景:您有一個基本路徑「/whatever/foo/」並且想要允許使用者使用 $_GET['path'] 指定相對於它的路徑。但是,您必須防止它們利用漏洞,例如存取目標目錄以外的檔案。
在使用者提供的路徑中搜尋「...」和「..」等序列的傳統方法是不夠的,因為它們可以被繞過。幸運的是,有更強大的解決方案。
透過 realpath() 利用真實路徑
要在允許相對路徑的同時有效防止目錄遍歷,請考慮使用 realpath()。此函數將給定路徑解析為其絕對物理位置,並考慮符號連結“.”。和“..”引用,以及其他虛擬目錄。
以下程式碼片段說明了這種方法:
$basepath = '/foo/bar/baz/'; $realBase = realpath($basepath); $userpath = $basepath . $_GET['path']; $realUserPath = realpath($userpath); if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) { //Directory Traversal! } else { //Good path! }
首先,透過將 realpath() 應用於基本路徑來獲得 $realBase ,確保它準確反映其物理位置。接下來,透過連接基本路徑和使用者提供的路徑來確定 $realUserPath,然後使用 realpath() 解析其實際實體路徑。
至關重要的是,我們將 $realUserPath 與 $realBase 進行比較。如果 $realUserPath 等於 false(表示路徑無效或不存在),或不以 $realBase 開頭,則識別為目錄遍歷嘗試。相反,如果 $realUserPath 以 $realBase 開頭,則表示允許的路徑。
透過使用realpath(),您可以獲得一種可靠的方法來防止目錄遍歷,同時允許PHP 中的相對路徑,有效保護您的應用程式免受惡意攻擊輸入並保持目錄結構的完整性。
以上是PHP 如何在允許相對路徑的同時防止目錄遍歷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!