質問: 現在、PHPを利用してファイルをダウンロードさせたいと考えています。 ``` \n"); } header('Content-Type: application/force-download'); header('Content-Length: '.filesize($file)); header('Content-Disposition: attachment; filename="'.$file.'"'); readfile($file); ?> ``` 上記の記述で、 ``` http://~~/download.php?file=audio/sample.mp3 ``` と入力した時にaudio/内のsample.mp3がうまくダウンロードできません。 *以下のデータが記述されたファイルがダウンロードされます。 Warning: readfile(): Filename cannot be empty in /home/~~/public_html/download.php on line 11 ファイルの読み込みが出来ていないようです。 どの部分を修正すれば、うまくダウンロードできるようになりますでしょうか? 勉強中の初心者で申し訳ありませんが、 ご教授のほどよろしくお願い致します。
回答: ポイントがいくつかあります。 phpの関数は当然document_rootより下のものや、画像以外も読むことができます。 つまりご提示のUIですと、サーバーの全てのファイルを任意にダウンロードされてしまうということです。 * document_rootより前に遡れないようにする * 拡張子など利用してダウンロードできるファイルを絞る * file_existsで存在を確認する * readfileを使わずfopen~fread~fcloseで対応する * filenameにパスが含まれないようにbasenameを使う * filter_inputを活用する $file = filter_input(INPUT_GET,'file'); など工夫してください