我有一个包含用户登录和会话的网站。我想允许我的用户将文件上传到网络服务器,但只允许他们登录。
我理解,如果我上传到某种公共网络目录,该文件仍然可以通过以下方式访问:
http://www.mydomain.com/files/thefile.pdf
但是,我想我可以将文件存储在公共HTML根目录上方的目录中(比如它的/ mnt / content / web / html)。
所以,我可以创建一个名为(/ mnt / content / web / uniqueidfortheuser)的目录并将我的文件存储在那里,然后通过PHP以语法引用文件:
(../ uniqueidfortheuser / thefile.pdf)。
我的问题 - 这是否足够安全或者我有什么东西可以忽略? uniqueidfortheuser的名称将存储在数据库中,并且用户不知道,并且他们必须拥有有效的会话才能访问其文件夹的唯一名称。而我认为他们无法通过网络调用该文件夹中的任何文件。
答案 0 :(得分:1)
更好 - 当用户上传文件时,请包含该文件的user_ID。然后,当您尝试检索文件时,请确保它属于用户。
因此,即使他们猜测另一个文件 - 它也不重要!
您需要使用readfile:
function user_files($file_name = "")
{
// Check user is logged in
if ($user->logged_in())
{
// Check file_name is valid and only contains valid chars
if ((preg_match('^[A-Za-z0-9]{1,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name))
{
// Now check file belongs to user - PSUEDOCODE
if ($filename == $user->records)
{
header('Content-Type: '.get_mime_by_extension(YOUR_PATH.$file_name)));
readfile(YOUR_PATH.$file_name);
} else {
echo 'You do not have access to this file';
}
}
}
}
目录遍历等存在一些问题 - 因此您需要首先检查$ file_name,就像我使用preg_match一样