TODO #21985
baserCMS4系でメールプラグインのindexアクションを実行すると500エラーが発生する事象対応
Status: | 終了 | Start date: | ||
---|---|---|---|---|
Priority: | 通常 | Due date: | ||
Assignee: | 村上 彬 | % Done: | 100% | |
Category: | - | |||
Target version: | 4.1.2 |
Description
とある案件で脆弱性診断を行ったときに発覚しました。
下記のような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(); }
実装は私が担当いたします。
以上、よろしくお願いいたします。
Associated revisions
History
#1 Updated by 村上 彬 over 2 years ago
- Description updated (diff)
#2 Updated by 村上 彬 over 2 years ago
- Description updated (diff)
#3 Updated by 村上 彬 over 2 years ago
- Description updated (diff)
#4 Updated by 江頭 竜二 over 2 years ago
村上さん、「メールコンテンツのデータを保持していない状態で」というのはどうやって再現できますか??
#5 Updated by 村上 彬 over 2 years ago
>江頭さん
村上さん、「メールコンテンツのデータを保持していない状態で」というのはどうやって再現できますか??
お疲れ様です。ご確認ありがとうございます!
あまり詳しい処理の流れは追えていないのが正直なところですが
単に下記のようなURLにアクセスするとその状態になります。
https://catchup.co.jp/mail/
こちらのURLを呼び出すとメールプラグインのメールコントローラのindexアクションが実行されますがおそらくその前に行うべき処理が実行されていないため「$this->dbDatas」に値が格納されていない状態になることで今回の事象が発生しているようです。
#6 Updated by 江頭 竜二 over 2 years ago
通常の動作では再現できず、脆弱性診断の際だけ発生したという事でしょうか?
最新版で、「mail」というメールフォームを作成して、公開ページにアクセスすると、普通に表示できて再現できないんですよね。
#7 Updated by 村上 彬 over 2 years ago
- Assignee changed from 村上 彬 to 江頭 竜二
返信が遅くなり申し訳ありません。
事象の説明や題名の書き方におそらく問題がありわかりにくくなってしまっていると思います。。すみません。
通常の動作では再現できず、脆弱性診断の際だけ発生したという事でしょうか?
最新版で、「mail」というメールフォームを作成して、公開ページにアクセスすると、普通に表示できて再現できないんですよね。
こちらおっしゃる通りmailというメールフォームが存在する場合は問題ないのですが存在しない場合に「https://catchup.co.jp/mail/」のようなURLでアクセスすると500エラーとなるようでございます。
例えばbaserCMSの最新をdefaultテーマでインストールするとmailというメールフォームは初期状態では存在しないため「http://baser4.localhost:8888/mail/」のようなURLでアクセスするとエラーになると思います。
こちら「存在しない」場合の挙動が問題でございまして「mail」というメールフォームが存在しない場合500エラーではなくて404エラーとなるのが正しい挙動ではないかという内容でございます。
500エラーですとセキュリティー的に攻撃対象となる可能性があるため脆弱性診断に引っかかったようでございます。
また話が分かりづらいようでしたら直接でもご説明いたしますのでおっしゃってください。
お手数おかけいたしますが何卒よろしくお願いいたします。
#8 Updated by 江頭 竜二 over 2 years ago
- Assignee changed from 江頭 竜二 to 村上 彬
なるほど、意味がわかりました。
実際にデバッグモードで実行してみると、123行目にて、$this->request->params['entityId'] のentityId キーがないと怒られます。
MailController は、動作条件として、$this->request->params['entityId'] が存在する事なので、その前の行で判定を入れて、存在しなければ、Not Foundにしてしまっていいと思います。
#9 Updated by 村上 彬 over 2 years ago
ご連絡とアドバイスありがとうございます!
下記ご案内頂いた内容で実装いたします!
なるほど、意味がわかりました。
実際にデバッグモードで実行してみると、123行目にて、$this->request->params['entityId'] のentityId キーがないと怒られます。MailController は、動作条件として、$this->request->params['entityId'] が存在する事なので、その前の行で判定を入れて、存在しなければ、Not Foundにしてしまっていいと思います。
#10 Updated by Anonymous over 2 years ago
- Status changed from 担当 to 解決
- % Done changed from 0 to 100
更新履歴 basercms|commit:a32a40e9f95d8ae1ef3011d501df1d43818f04d1 で適用されました。
#11 Updated by 江頭 竜二 over 2 years ago
- Target version changed from 4.2.0 to 4.1.2
#12 Updated by 江頭 竜二 over 2 years ago
- Status changed from 解決 to 終了