ど素人から毛を生やす。<延>

PHPでファイルをダウンロードさせようとしたら空の実行ファイルがダウンロードされた事案のたぶんレアケース。

Web > PHP 2019年3月26日(最終更新:5年前)

2019年3月26日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

DBからcsvをダウンロードするphpを移植したら、空の(実行ファイル名).phpがダウンロードされてしまう事象が起きました。
開発や検証中にはそのような事例は一度も無かったのですが、はて。

この原因ですが、端的に言えば何も出力できないのに出力しようとしたことによるものでした。

解説しますと、最終的に出力するための記載がこれです。

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/octet-stream");
header("Content-Disposition:attachment; filename=$name");
echo $str;

で、この$name(ファイル名)と$str(ファイルの中身)が不測の事態により「空文字」になってしまったのにechoされてしまった。

ファイル名無しではダウンロードさせられないため、自動的に実行ファイル名が生成ファイル名になってしまったようです。
中身が空なのは、空文字をechoしていたので当然ですね。

具体的にはDBに空文字のプライマリキーとかいう想定外のごみデータがあり、これによりJOINが狂い、そしてSQLの取得結果がバグった。
本来は出力できない=エラーcsvに出力するため、必ず1件以上のcsvを出力する手はずになっていたのですが、バグデータはエラーチェックをスキップしてしまい、結果として空のデータを出力することになってしまったわけです。
内輪向けシステムとはいえ、もーちょっとSQL回りを強固にしておくべきでした。

以上、このパターンはggっても見当たらなかったので、レアケですが参考までに。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)