Php scandir限制访问

时间:2014-09-04 08:36:11

标签: php

我为我的网站制作了一个简单的文件管理器脚本。

为了列出文件夹中的所有文件和类别,我使用了scandir()功能。我有一个包含基本路径的变量,如$path = /var/www/mysite/uploads。然后我有一个函数,它接受包含附加路径的GET变量,如/my/photos/,所以我返回/var/www/mysite/uploads/my/photos的内容。

问题在于,如果用户发送../../../之类的内容,他就可以登录目录树,并能够观看整个系统。

我该如何限制?我用Google搜索的唯一内容是chroot,但不确定这是否是我需要的

3 个答案:

答案 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";
}

Live demo

说明:用户提供的路径与存储路径联系。然后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!');
}