首頁 > 後端開發 > php教程 > PHP 如何在允許相對路徑的同時防止目錄遍歷?

PHP 如何在允許相對路徑的同時防止目錄遍歷?

Barbara Streisand
發布: 2024-12-05 02:01:07
原創
873 人瀏覽過

How Can PHP Prevent Directory Traversal While Allowing Relative Paths?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板