0

我有一个包含用户登录和会话的站点。我想允许我的用户将文件上传到网络服务器,但只有他们可用于登录。

我知道如果我上传到某种公共网络目录,该文件仍然可以通过以下方式访问:

http://www.mydomain.com/files/thefile.pdf

但是,我想我可以将文件存储在我的公共 HTML 根目录上方的目录中(比如 /mnt/content/web/html)。

因此,我可以创建一个名为 (/mnt/content/web/uniqueidfortheuser) 的目录并将我的文件存储在那里,然后通过 PHP 使用以下语法引用文件:

(../uniqueidfortheuser/thefile.pdf)。

我的问题 - 这足够安全还是我忽略了什么?uniqueidfortheuser 的名称将存储在数据库中,用户不知道,他们必须有一个有效的会话才能访问其文件夹的唯一名称。而且我认为他们无法从网络调用文件夹中的任何文件。

4

1 回答 1

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 一样

于 2012-12-23T04:42:41.963 回答