-2

DB から指定されたリストから csv ファイルを作成し、ユーザーがそれをダウンロードできるようにするこのアプリケーションを作成しました! 仕事を終えたとき、セキュリティの問題があることに気づきました!

リクエストを行うために使用しているajasは次のとおりです。

$.ajax({
            type: "POST",
            url:HTTPS + '/lib/model/data/ctlRates.php?export=1',
            data: {
                ext: ext,
                filter: filter,
                fileName: fileName
            },
            dataType: 'json',
            success: function(data){
                if(data['results'] == "success"){
                    console.log(data['results']);
                    var filename = data['filename'];
                    var extension = data['ext'];
                    window.location = HTTPS + '/lib/model/data/ctlRates.php download=1&filename='+filename+'&ext='+extension;
                } else {
                    console.log(data['results']);
                }
            }
        });
    } else {
        alert("Error: File name and extension must be provided");
    }
});

そして、ほとんどの人はすでに問題を認識していると思います!
しかし、これは window.location が指しているコントローラーです:

if(isset($_GET['download']) && $_GET['download'] == 1){
$filePath = "/path/to/file/dir";
$name = $_GET['filename'];
$extension = $_GET['ext'];

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-Description: File Transfer');
header('Content-type: text/'.$extension.'');
header('Content-Disposition: attachment; filename="'.$name.".".$extension.'');
header("Content-Transfer-Encoding: binary");
header("Pragma: public");
ob_clean();
flush();
readfile($filePath.$name.".".$extension);

}

テストを開始し、誰もが好きなファイル名と拡張子を入力して、そのディレクトリからファイルを取得できることに気づきました....この穴を埋める方法はありますか?

4

1 に答える 1