1
$f = $_GET['f'];
//f = filename i.e file.mp3
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($f));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($f));
ob_clean();
flush();

このコードは、すべてのmp3ファイルをルートディレクトリに保存している場合は機能しますが、/filesなどの別のフォルダーに保存している場合は機能しません。

ベース名を変更してパスを追加しようとしました$fが、うまくいきませんでした

このコードでrootではなくdirからファイルをダウンロードする方法はありますか?

4

1 に答える 1

1

basenameこれは、ファイルパスのファイル名部分以外のすべてを明示的に削除するためです。したがってbasename("foo/bar/baz.mp3")、「baz.mp3」が生成されます。

また、他の人がすでにPHPスクリプトのコーディング方法について言及しているように、これは重大なセキュリティ上の欠陥です。これは、誰かが「www.example.com/index.php?f=index.php」やスクリプト( www.example.com/index.phpにあります)独自のソースを提供します。少しの創造性で、スクリプトがアクセスできる外部ファイルはすべて、その方法でダウンロードできます。良くありません。ファイルを許可されたパスのホワイトリストに制限する必要があります。

于 2012-12-23T00:54:46.160 に答える