2017-03-27 13 views
1

認証されたユーザーにレポートへのアクセスを提供しようとしています。私は(ログインしているユーザーに応じて)このようなリンクを作成するには、次のコードで :安全なダウンロード可能なリンク

echo "<a href = 'http://127.0.0.1:8080/reports.php?file=XXXXXX.html'>Download Report Januar</a>"; 

が、これはそれを行うための保存方法ですまたは任意のより良いアイデアがあるのですか?

$dir = '/var/www/html/44ahj34k578adfhq238iqdn7VB/'; 
$type = 'text/html'; 


if(!empty($_GET['file']) && !preg_match('=/=', $_GET['file'])) { 
    if ($_SESSION['username'] == 'XXXXX') { 
      if(file_exists ($dir.$_GET['file']))  { 
      makeDownload($_GET['file'], $dir, $type); 
     } 
    } else { 
     die("sorry, but you are not my type."); 
    } 
} 


function makeDownload($file, $dir, $type) { 

    header("Content-Type: $type"); 
    header("Content-Disposition: attachment; filename=\"$file\""); 
    readfile($dir.$file); 
} 

// File permissions: 
    // drwxr-xr-x 2 www-data root  4096 Mar 27 10:12 44ahj34k578adfhq238iqdn7VB 
    // -rw-r--r-- 1 www-data root 5056 Mar 27 10:13 XXXXX.html 
+0

したがって、ファイル名はユーザー名の後に付けられますか? – Terry

+0

いいえ、XXXは自分のデータをここで匿名化したものです。 –

答えて

0

私はいくつかのセキュリティ問題に気づく:

  • あなたはHTTPS経由でダウンロードリンクを提供したいと思います。
  • 本質的にチェックされていない$ _GET変数に基づいて、どのファイルにもリンクしたくないです。
  • 特定のディレクトリにあるファイルを開く権限を与えるのではなく、ユーザーを特定のファイルにさらに制限することができます。
+0

私は最後の2つのコメントを理解していません。サーバー上のファイルはユーザー "www-data"に属します。ファイルを実際に認証してダウンロードするユーザー(多くのユーザーになる)は、Webサーバー上に存在しません。彼のダウンロードリストを各ユーザーごとに作成します。 ?file = filename.htmlを使用します。もちろん、これらのリンクは推測できます。したがって、パーミッションのないユーザーは、「あなたのタイプではありません」と死にます。私の見解では、安全でない部分は無差別に攻撃される可能性のある44ahj34k578adfhq238iqdn7VB - ディレクトリです。 –

+0

$ _GET変数から来るものはすべて安全ではありません。たとえば、次のようなディレクトリトラバーサル攻撃を試みることができます:http://127.0.0.1:8080/reports.php?file=../../another_file.txt現在の実装ではそれを保護しますか?私はあなたの現在のpreg_match正規表現を渡すと信じています。また、私が最後に言及したように、これにより、ユーザーはそのディレクトリ内の任意のファイルを潜在的にダウンロードすることができます(受け入れられるかもしれません)。 – alaric

+0

私はあまりにも真剣にあいまいで安全を守らないようお勧めします。サイトのユーザーは、サーバー上のすべてのファイル/ディレクトリ名を知っていて、どうにかしたくないファイルにアクセスできないようにしてください。 – alaric

関連する問題