我为我的网站制作了一个简单的文件管理器脚本。
为了列出文件夹中的所有文件和类别,我使用了scandir()
功能。我有一个包含基本路径的变量,如$path = /var/www/mysite/uploads
。然后我有一个函数,它接受包含附加路径的GET变量,如/my/photos/
,所以我返回/var/www/mysite/uploads/my/photos
的内容。
问题在于,如果用户发送../../../
之类的内容,他就可以登录目录树,并能够观看整个系统。
我该如何限制?我用Google搜索的唯一内容是chroot
,但不确定这是否是我需要的
答案 0 :(得分:1)
您可以使用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
用于将此路径转换为absolute path。如果绝对路径以存储路径开始,则一切正常,否则不行。
当然,首先针对RegEx运行用户提供的路径也是很好的,这样您就可以确保路径只包含有效字符。
答案 1 :(得分:0)
您始终必须验证用户输入!做一个正则表达式来验证$ _GET ['path']。
此外,您的服务器应该由文件系统权限很低的用户运行。
答案 2 :(得分:0)
您必须回答的第一个问题是您接受用户路径的原因。
在此之后,如果确实需要,您必须保护您的输入不受绝对路径或..
的使用。
类似
$project_path = realpath($project_path);
$realpath = realpath($user_input);
if (str_pos($realpath, $project_path) !== 0) {
throw Exception('Security perimeter violation!');
}