プロジェクト

全般

プロフィール

Bug(バグ) #3519

未完了

管理画面 カテゴリの編集時に csrf_token のバリデーションエラーが発生する場合にホワイトアウトする

Yuya Watanabe さんがほぼ11年前に追加. ほぼ5年前に更新.

ステータス:
New(新規)
優先度:
Low(低め)
担当者:
-
対象バージョン:
開始日:
2013-12-09
期日:
進捗率:

0%

予定工数:
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

説明

概要

管理画面 カテゴリの編集時に csrf_token のバリデーションエラーが発生する場合にホワイトアウトする.

再現手順

  1. 「管理画面 > コミュニティカテゴリ設定」 を開く( /pc_backend.php/community/categoryList )
  2. 何らかの方法で csrf_token の値を書き換えてそのフォームの「編集」ボタンをクリック
    • 例えば WebDeveloper の「フォーム > 画面内にフォーム情報を表示」で表示された _csrf_token のフォームの値を変更
  3. ホワイトアウトする

dev モードで閲覧すると下記のようなエラーメッセージが表示される.

Fatal error: Call to a member function getMessage() on a non-object in .../apps/pc_backend/modules/community/actions/actions.class.php on line 216 

テストコード実行時

$ php test/functional/pc_backend/communityActionsTest.php 
> Login
# get /
# post /symfony/login
> /community/categoryList - CSRF
# post /community/categoryList
ok 1 - message about CSRF token exists
> /community/categoryEdit/id/1 - CSRF
# post /community/categoryEdit/id/1
not ok 2 - message about CSRF token exists
#     Failed test (./lib/test/opTestFunctional.class.php at line 89)
#            got: false
#       expected: true
> /community/categoryDelete/id/1 - CSRF
# post /community/categoryDelete/id/1
ok 3 - message about CSRF token exists
> /community/addDefaultCommunity/id/1 - CSRF
# post /community/addDefaultCommunity/id/1
not ok 4 - message about CSRF token exists
#     Failed test (./lib/test/opTestFunctional.class.php at line 89)
#            got: false
#       expected: true
> /community/removeDefaultCommunity/id/1 - CSRF
# post /community/removeDefaultCommunity/id/1
ok 5 - message about CSRF token exists
> /community/addAllMember/id/1 - CSRF
# post /community/addAllMember/id/1
ok 6 - message about CSRF token exists
> /community/delete/id/1 - CSRF
# post /community/delete/id/1
ok 7 - message about CSRF token exists
> /community/list - XSS
# get /community/list
ok 8 - all of value of Member.name are escaped.
ok 9 - all of value of Community.name are escaped.
> /community/defaultCommunityList - XSS
# get /community/defaultCommunityList
ok 10 - all of value of Member.name are escaped.
ok 11 - all of value of Community.name2 are escaped.
> /community/addDefaultCommunity/id/1055 - XSS
# get /community/addDefaultCommunity/id/1055
ok 12 - all of value of Member.name are escaped.
ok 13 - all of value of Community.name are escaped.
> /community/removeDefaultCommunity/id/1056 - XSS
# get /community/removeDefaultCommunity/id/1056
ok 14 - all of value of Member.name are escaped.
ok 15 - all of value of Community.name2 are escaped.
> /community/addAllMember/id/1055 - XSS
# get /community/addAllMember/id/1055
ok 16 - all of value of Member.name are escaped.
ok 17 - all of value of Community.name are escaped.
> /community/delete/id/1055 - XSS
# get /community/delete/id/1055
ok 18 - all of value of Member.name are escaped.
ok 19 - all of value of Community.name are escaped.
1..19
# Looks like you failed 2 tests of 19.

原因

#1602 「コミュニティカテゴリを空欄で追加できてしまう」でグローバルエラーに「必須項目です。」のようなエラーを表示作用として name のみを対象とするようになったため,それ以外のエラーメッセージが発生して name にはエラーがない場合にオブジェクトが得られずホワイトアウトする.

修正案

  • 空欄のエラーメッセージをグローバルエラーではなくそれぞれのフォームフィールドでエラーメッセージを表示する
    • この場合、 CommunityCategory モデルから getForm() でフォームが取得されているためバリデーション時の情報がフォームレンダリング時に失われている状態であるのでその修正を行う必要がある
  • すべてのエラーを表示するように変更する

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