TODO #21985

baserCMS4系でメールプラグインのindexアクションを実行すると500エラーが発生する事象対応

村上 彬2ヶ月前に追加. 約1ヶ月前に更新.

ステータス:終了開始日:
優先度:通常期日:
担当者:村上 彬進捗率:

100%

カテゴリ:-
対象バージョン:4.1.2

説明

とある案件で脆弱性診断を行ったときに発覚しました。
下記のようなURLにアクセスするとエラー「500 Internal Server Error」発生します。
https://catchup.co.jp/mail/
※MailプラグインのMailコントローラのindexアクション(メールフォームを表示する)

下記の箇所でメールコンテンツのデータを保持していない状態でメールコンテンツのテンプレートをレンダリングしようとしていることが原因のようです。
lib/Baser/Plugin/Mail/Controller/MailController.php

public function index() {
... 
#224 $this->render($this->dbDatas['mailContent']['MailContent']['form_template'] . DS . 'index');

indexメソッドの先頭でデータを保持しているかチェックし保持していない場合404エラーを返却すれば回避できそうです。

/**
 * [PUBIC] フォームを表示する
 *
 * @return void
 */
    public function index($id = null) {
        if (!isset($this->dbDatas['mailContent']['MailContent'])) {
            $this->notFound();
        }

実装は私が担当いたします。
以上、よろしくお願いいたします。


関係しているリビジョン

リビジョン a32a40e9
a-killer-bee が約1ヶ月前に追加

fix #21985 baserCMS4系でメールプラグインのindexアクションを実行すると500エラーが発生する事象対応 (#933)

履歴

#1 村上 彬2ヶ月前に更新

  • 説明 を更新 (diff)

#2 村上 彬2ヶ月前に更新

  • 説明 を更新 (diff)

#3 村上 彬2ヶ月前に更新

  • 説明 を更新 (diff)

#4 江頭 竜二2ヶ月前に更新

村上さん、「メールコンテンツのデータを保持していない状態で」というのはどうやって再現できますか??

#5 村上 彬2ヶ月前に更新

>江頭さん

村上さん、「メールコンテンツのデータを保持していない状態で」というのはどうやって再現できますか??

お疲れ様です。ご確認ありがとうございます!
あまり詳しい処理の流れは追えていないのが正直なところですが
単に下記のようなURLにアクセスするとその状態になります。
https://catchup.co.jp/mail/
こちらのURLを呼び出すとメールプラグインのメールコントローラのindexアクションが実行されますがおそらくその前に行うべき処理が実行されていないため「$this->dbDatas」に値が格納されていない状態になることで今回の事象が発生しているようです。

#6 江頭 竜二2ヶ月前に更新

通常の動作では再現できず、脆弱性診断の際だけ発生したという事でしょうか?

最新版で、「mail」というメールフォームを作成して、公開ページにアクセスすると、普通に表示できて再現できないんですよね。

#7 村上 彬約1ヶ月前に更新

  • 担当者村上 彬 から 江頭 竜二 に変更

返信が遅くなり申し訳ありません。
事象の説明や題名の書き方におそらく問題がありわかりにくくなってしまっていると思います。。すみません。

通常の動作では再現できず、脆弱性診断の際だけ発生したという事でしょうか?

最新版で、「mail」というメールフォームを作成して、公開ページにアクセスすると、普通に表示できて再現できないんですよね。

こちらおっしゃる通りmailというメールフォームが存在する場合は問題ないのですが存在しない場合に「https://catchup.co.jp/mail/」のようなURLでアクセスすると500エラーとなるようでございます。
例えばbaserCMSの最新をdefaultテーマでインストールするとmailというメールフォームは初期状態では存在しないため「http://baser4.localhost:8888/mail/」のようなURLでアクセスするとエラーになると思います。
こちら「存在しない」場合の挙動が問題でございまして「mail」というメールフォームが存在しない場合500エラーではなくて404エラーとなるのが正しい挙動ではないかという内容でございます。
500エラーですとセキュリティー的に攻撃対象となる可能性があるため脆弱性診断に引っかかったようでございます。

また話が分かりづらいようでしたら直接でもご説明いたしますのでおっしゃってください。
お手数おかけいたしますが何卒よろしくお願いいたします。

#8 江頭 竜二約1ヶ月前に更新

  • 担当者江頭 竜二 から 村上 彬 に変更

なるほど、意味がわかりました。
実際にデバッグモードで実行してみると、123行目にて、$this->request->params['entityId'] のentityId キーがないと怒られます。

MailController は、動作条件として、$this->request->params['entityId'] が存在する事なので、その前の行で判定を入れて、存在しなければ、Not Foundにしてしまっていいと思います。

#9 村上 彬約1ヶ月前に更新

ご連絡とアドバイスありがとうございます!
下記ご案内頂いた内容で実装いたします!

なるほど、意味がわかりました。
実際にデバッグモードで実行してみると、123行目にて、$this->request->params['entityId'] のentityId キーがないと怒られます。

MailController は、動作条件として、$this->request->params['entityId'] が存在する事なので、その前の行で判定を入れて、存在しなければ、Not Foundにしてしまっていいと思います。

#10 匿名ユーザー が約1ヶ月前に更新

  • ステータス担当 から 解決 に変更
  • 進捗率0 から 100 に変更

更新履歴 basercms|commit:a32a40e9f95d8ae1ef3011d501df1d43818f04d1 で適用されました。

#11 江頭 竜二約1ヶ月前に更新

  • 対象バージョン4.2.0 から 4.1.2 に変更

#12 江頭 竜二約1ヶ月前に更新

  • ステータス解決 から 終了 に変更

他の形式にエクスポート: Atom PDF