簡體   English   中英

php scandir限制訪問

[英]Php scandir limit access

我為網站制作了一個簡單的文件管理器腳本。

為了列出文件夾中的所有文件和類別,我使用scandir()函數。 我有一個包含基本路徑的變量,例如$path = /var/www/mysite/uploads 然后,我有一個函數,該函數接受包含其他路徑的GET變量,例如/my/photos/所以我返回/var/www/mysite/uploads/my/photos

問題是,如果用戶發送../../../東西,他將進入目錄樹並能夠監視整個系統。

如何限制呢? 我唯一搜索過chroot ,但不確定這是否是我需要的

您可以使用realpath()

$storagePath = "/var/www/mysite/uploads";
$path = $storagePath . $userPath;

$path = realpath($path);
if(strpos($path, $storagePath) === 0){
   //Path is okay
   echo "Okay";
}
else {
   //User wants to gain access into a forbidden area.
   echo "Danger";
}

現場演示

說明:用戶提供的路徑已與存儲路徑聯系。 然后使用realpath將此路徑轉換為絕對路徑 如果絕對路徑以存儲路徑開頭,則一切正常,否則不行。

當然,最好先針對RegEx運行用戶提供的路徑,以確保該路徑僅包含有效字符。

您始終必須驗證用戶輸入! 做一個正則表達式來驗證$ _GET ['path']。

同樣,您的服務器應由對文件系統具有非常低特權的用戶運行。

您必須回答的第一個問題是為什么要接受用戶路徑。

此后,如果確實需要,則必須保護輸入內容免受絕對路徑或在其上使用..

用類似的東西

$project_path = realpath($project_path); 
$realpath = realpath($user_input); 
if (str_pos($realpath, $project_path) !== 0) {
    throw Exception('Security perimeter violation!');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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