■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか?

 

<前のページ |  1  |  2  

n1215 > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/17 2:17
kenecy 様
Antennix 様

こんばんは。

先ほどから試してみて、原因の検討が付いたのでわかったところまで書いておきます。

結論から述べると、CSRFトークンのバリデーションが原因です。

●CSRF・CSRFトークン
攻撃用の外部Webページから利用者の意図しないHTTPリクエストを送るCSRF(クロスサイトリクエストフォージェリ)攻撃への対策として、
多くのWebアプリケーションフレームワークでCSRFトークンという乱数値(暗号論的擬似乱数値)を利用する仕組みが実装されています。
サーバでHTMLを生成した際にトークン(乱数値)をformのhiddenパラメータ等として仕込んでおき、
フォームデータの送信時にこのトークンをサーバ側で再び確認することで、不正なリクエストを防ぐというものです。

●CakePHPの仕様
CakePHPではSecurityComponentがCSRFトークンの生成やバリデーションを司っており、
デフォルトでは一度利用したトークンは再利用しない(= SecurityComponentのcsrfUseOnceプロパティがtrue)というセキュリティポリシーを採用しています。
このため、同じページから同じトークンを利用して2度のAjaxリクエスト(baserCMSの現在の仕様ではログインはAjaxによるものなので)を行うと2度目はエラーとなります。
ページをリロードしてCSRFトークンを更新すれば再び1度目は正常に処理されますね。
※CSRFトークンの値はHTMLのソースを見ればformのhiddenパラメータ data[_Token][]で確認できます。

●/admin/users/login のページではエラーが起こらない理由
csrfでソースコードを検索してみたところ、どうやらbaserCMSの管理画面(正確にはログイン画面を含む/admin/以下?)
ではCSRFのチェックを行っていないようです。
https://github.com/basercms/basercms/blob/dev-3/lib/Baser/Controller/BcAppController.php の 413行目あたり
		// TODO 管理画面は送信データチェックを行わない(全て対応させるのは大変なので暫定処置)
		if (!empty($this->request->params['admin'])) {
			$this->Security->validatePost = false;
			$this->Security->csrfCheck = false;
		}


従って、この部分を何らかの方法で上書きし、/mypage/以下もCSRFのチェックを行わない、
またはCSRFトークンを使いまわせる仕様にすれば($this->Security->csrfUseOnce = false)
同じように問題を解決できるはずです。
※ifをコメントアウトしてズボラな確認をしてみたところOKでした。

暫定処置とあるようにあまり褒められた対応ではありませんが、ご確認ください。


なお、コア開発のチケットを見ると、管理画面のログインは近々Ajax方式から通常のPOSTに変更されるようです。
http://project.e-catchup.jp/issues/5512
通常のPOSTであればCSRFトークンの更新もPOSTの都度行われるため、この問題はなくなるはずですね。

Twitter: @n_1215

Antennix > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/17 14:52
>n1215様

こんにちは。

頂いた情報を元に対応し、こちらでも改善が確認できました。
タイミングの悪いときに、この問題に取り掛かってしまったようですね・・

情報を共有頂き、ありがとうございますmm
iwahei0813 > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/21 13:57
kenecyさん!こんにちわ!(*´∀`*)

baserの3系の読み込み順は下記のURLにありますね!!
http://basercms.net/manuals/3/programmers/3.html

引用:
/app/webroot/theme/{テーマ名}/View/Layouts/default.php は
/app/webroot/theme/{テーマ名}/Layouts/default.php の間違いなのではないかと思うのですが、
こうした情報のフィードバックはどうしたらよろしいでしょうか?


おそらくこの情報はあっていると思います^0^

例えば、、
/lib/Baser/View/の中を見ていただくと、色々なファイルがあると思いますが、
これらのファイルを変えたい場合は、/app/webroot/theme/{テーマ名}/View/にファイルを作成するようになると思います!^^
※baserの更新による上書きを防ぐ為です!

 

<前のページ |  1  |  2  

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
27 人のユーザが現在オンラインです。 (26 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 27