0

ユーザーのログインとセッションを含むサイトがあります。ユーザーがファイルを Web サーバーにアップロードできるようにしたいのですが、それらのファイルはログイン時にのみ使用できるようにします。

なんらかのパブリック Web ディレクトリにアップロードすると、次の方法でファイルに引き続きアクセスできることを理解しています。

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

ただし、公開 HTML ルートのすぐ上のディレクトリ (/mnt/content/web/html とします) にファイルを保存できると考えています。

したがって、(/mnt/content/web/uniqueidfortheuser) という名前のディレクトリを作成してそこにファイルを保存し、PHP を介して次の構文でファイルを参照できます。

(../uniqueidfortheuser/thefile.pdf)。

私の質問 - これは十分に安全ですか、それとも私が見落としているものがありますか? ユーザーの一意の ID の名前はデータベースに保存され、ユーザーには知られず、フォルダーの一意の名前にアクセスするには有効なセッションが必要です。また、フォルダー内のファイルを Web から呼び出すことはできないと思います。

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';
                }
           }
        }
    }

ディレクトリ トラバーサルなどに関していくつかの問題があります。そのため、preg_match を使用したように、最初に $file_name を確認する必要があります。

于 2012-12-23T04:42:41.963 に答える