Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか?
- kenecy > baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/8 19:27
- goichi > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/8 22:48
- kenecy > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/9 11:11
- kenecy > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/9 14:23
- goichi > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/9 14:51
- kenecy > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/9 18:11
- iwahei0813 > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/10 10:42
- kenecy > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/11 18:22
- iwahei0813 > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/21 13:57
- Antennix > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/10 16:38
- kenecy > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/11 18:34
- » n1215 > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/17 2:17
- Antennix > Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか? @ 2014/4/17 14:52
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行目あたり
従って、この部分を何らかの方法で上書きし、/mypage/以下もCSRFのチェックを行わない、 またはCSRFトークンを使いまわせる仕様にすれば($this->Security->csrfUseOnce = false) 同じように問題を解決できるはずです。 ※ifをコメントアウトしてズボラな確認をしてみたところOKでした。 暫定処置とあるようにあまり褒められた対応ではありませんが、ご確認ください。 なお、コア開発のチケットを見ると、管理画面のログインは近々Ajax方式から通常のPOSTに変更されるようです。 http://project.e-catchup.jp/issues/5512 通常のPOSTであればCSRFトークンの更新もPOSTの都度行われるため、この問題はなくなるはずですね。 Twitter: @n_1215 |