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