ファイルの公開期間外に設定するとフロントで500エラーになる不具合の修正#4475
Conversation
| if ($display && !file_exists(WWW_ROOT . 'files' . DS . 'uploads' . DS . 'limited' . DS . $filename)) { | ||
| $display = false; | ||
| } |
There was a problem hiding this comment.
@IwasakiRyuichi
debug=true では 404 になったので、new Stream のエラーでは無いと考えています。
またbcblogに関しても掲載期間を期間外にした場合はログイン有無に限らず「An Internal Server Error Occurred」が発生します。
そのため、より根本的な問題な気がします。
私の考えとしては以下です。
- UploaderFilesControllerが末尾でnotFoundメソッドを呼び出す
- 継承元のAppController.php のnotFoundメソッドは例外を呼び出す
- cakephpのコア処理がWebExceptionRenderer.phpが例外をキャッチしてしまい「An Internal Server Error Occurred」が発生する
確認したところ、cakephp 5.2.0になった際の仕様変更だと思います。
cakephp/cakephp#17958
BcErrorController.phpで、notFoundメソッドを継承してsetTemplateを呼び出すような形が適切だと考えていますがどうでしょうか
There was a problem hiding this comment.
Pull request overview
アップロードファイル(公開制限付き)の閲覧において、公開期間外などの条件で実ファイルが存在しない場合に Stream() で例外が発生して 500 になる問題を、ファイル存在チェック追加により 404 へフォールバックさせることを目的としたPRです。/files/uploads/* ルート経由でファイル配信を行う UploaderFilesController::view_limited_file() の安定性を改善します。
Changes:
- 公開対象と判定された場合でも、実ファイルが存在しないケースを検知して 404 にする分岐を追加
- (推奨)ワイルドカードルート入力をパス結合する箇所の安全性を高める余地(パストラバーサル/読み取り不可ファイル)
| if ($display && !file_exists(WWW_ROOT . 'files' . DS . 'uploads' . DS . 'limited' . DS . $filename)) { | ||
| $display = false; | ||
| } |
| if ($display && !file_exists(WWW_ROOT . 'files' . DS . 'uploads' . DS . 'limited' . DS . $filename)) { | ||
| $display = false; | ||
| } |
|
@IwasakiRyuichi |
|
@IwasakiRyuichi @teratai3 ありがとうございます。マージしますね。 |
@ryuring
概要
アップロードファイル一覧で、画像の公開設定の開始日付を期間外にして、URLを別リンク(シークレットウィンドゥ)で開くと404ではなく500エラーになっておりました
原因
plugins/bc-uploader/src/Controller/UploaderFilesController.phpのview_limited_file()で、公開期間かどうかを判定して$displayをtrue/falseにしています。falseの際に404にする使用ですが、$displayがtrueの場合に、最後に、new Stream(WWW_ROOT . 'files/uploads/limited/' . $filename)を呼び出していますが、ここでそのファイルが存在するかをチェックせずにファイルを読み出すためファイル読み込みでエラーが発生し、それが原因で500エラーになっておりました修正内容
実ファイルのチェック処理を追加しました。
ご確認お願いします。