使用PHP保护上传的文件

时间:2012-12-23 04:39:20

标签: php security code-access-security

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

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

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

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

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

(../ uniqueidfortheuser / thefile.pdf)。

我的问题 - 这是否足够安全或者我有什么东西可以忽略? uniqueidfortheuser的名称将存储在数据库中,并且用户不知道,并且他们必须拥有有效的会话才能访问其文件夹的唯一名称。而我认为他们无法通过网络调用该文件夹中的任何文件。

1 个答案:

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