在我的php文件中,我使用$ _GET参数在我的服务器上打开文件,如下所示:
$filename = $_GET["filename"];
$content = file_get_contents("/path_to_files/".$filename);
我的问题是,如何让这更安全,以便用户无法访问服务器上父文件夹中的文件?这是我需要在服务器上执行的操作,例如权限和/或配置吗?或者应该在我的php文件中验证$filename
?
提前谢谢!
答案 0 :(得分:5)
最安全的方法是在使用文件路径时避免使用外部参数。 你可以实现这样的东西:
$files = array (
'file1' => 'path/to/file1.php',
'file2' => 'path/to/file2.php',
'file3' => 'path/to/file3.php',
...
);
if ( in_array($_GET['file'], array_keys($files) ) )
{
$content = file_get_contents($files[$GET['file']]);
}
否则......从这里检查方法: string sanitizer for filename
答案 1 :(得分:1)
我认为您不必对服务器上的权限做些什么,因为它实际上是访问文件的php,而不是用户。
您可以针对白名单文件检查$ filename。 你能提供更多关于你想做什么的信息吗?
答案 2 :(得分:1)
最好是允许文件使用“白名单”;
U可能有文件名模式, [someName] [dot] [extension]
if (!preg_match('/^[a-zA-Z0-9_-]+\.[a-zA-Z0-9]+$/', $filename) {
throw new Exception('file not allowed');
}
但是这样,用户可以访问/ path_to_files /目录中的所有文件
答案 3 :(得分:1)
您发布的方法不是一种非常安全的方法,您应该考虑更改它。
如果您需要使用此方法,请对您的脚本进行以下更改
$filename = basename($_GET["filename"]);
$content = file_get_contents("/path_to_files/".$filename, false);
file_get_contents函数中的false参数只会查找您提供的路径中的文件,而不会查找其他位置。
答案 4 :(得分:0)
白名单似乎是最安全的方式,但您可以使用这样的脚本
$file = realpath("/path_to_files/" . $_GET['filename']);
// Check that $file is actually in the specified path
if(substr($file, 0, strlen("/path_to_files/")) == "/path_to_files/"){
include($file);
}
但我不知道是否有可能欺骗现实......