[Wicket-ja-user 514] Re: セッション再生成後のページ遷移

Zurück zum Archiv-Index

Tsutomu Yano t_yano****@me*****
2011年 3月 4日 (金) 14:47:55 JST


矢野です。

 直接的な回答でないので恐縮なのですが… 
 おそらく、旧セッションの内容を新セッションに複製しないと、うまく動かないと思います。(Wicketとは関係なく)認証後も認証前のセッション情報を必要とするケースは多々あり、そういう場合はやはり内容の転写を行うようです。

 私はログイン有無とセッション維持とは別に管理してます。サーブレットコンテナでは、セッションIDって勝手に発行されてしまって制御がややこしいので、発行を自分で管理できるクッキーを自分で発行します。

 具体的には、ログイン成功時にはログインクッキーを発行し、ログイン要ページでは、そのクッキーが確認できない限りはログイン画面に差し戻す、というプログラムを作ります。実際にはもう少し細かい制御が必要ですけども(クッキーを作ってから、クッキーがブラウザに届くまでの間のページ制御に工夫が少し必要)、大枠としてはそういうことです。
 今回の件でも、同じHttpSessionを継続して使えていれば、SessionExpiredにならないわけですし。

 認証が必要なページではすべて、ログイン時に発行したクッキーが届いているかどうかを判定することで、不正な接続を排除できます。仮に誰かが何らかの方法でセッションIDを知ったとしても、ログインクッキーがない以上は認証後画面に入ることはできません。セッションフィクセーション攻撃には耐性があるはずです。

 Wicket独自の解決法ってわけでもないのでちょっとした逃げのようにも思えますが、セッション維持とログイン制御を分離できるので、なにかと便利です。実装もそれほどたいへんではありませんし。

 ちなみに、CSRF対策としては、Wicketが発番するページ番号をランダムにするといいです。Wicketでは仕組み上、ページ番号がわからないかぎり、フォームのポストは行えません。ページ番号をランダムにするには、SessionのnextPageId()をオーバーライドするだけなので、簡単にセキュリティ強化できます(デフォルトは1からの連番なので容易に推測できてしまいます)。

参考案として書きました。

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

On 2011/03/01, at 18:54, Masaya seko wrote:

> お世話になっております。世古と申します。
> 
> 分からないことがあって困っております。
> どなたかご存知の方が居られましたらご教授ください。
> 
> ■環境
> Wicket 1.3.6
> 
> ■やりたいこと
> 以下の2点を行ないたいと考えております。
> 1.認証が必要なページ(以降「Aページ」とします)を表示した際に、ログイン画面を
>   出したい。ログイン画面でログインの操作を行なった後は、Aページに遷移したい
>> 2.CSRF対策として、ログイン後にセッションの再発行を行ないたい。
> 
> 1については、hayasshさんのエントリ内に記載されている
> http://d.hatena.ne.jp/hayassh/20090415/1239797052と似た感じのことをしています
>> 私はIAuthorizationStrategyとIUnauthorizedComponentInstantiationListenerを
> 使用しているため細部はことなりますが、「ログイン後は、Aページに遷移したい」の
> 部分については、continueToOriginalDestination()を使用しています。
> 
> 2については、ログイン成功時に以下のようにして行なっています
> (Wicket1.4のSession#replaceSession()と同じ処理)。
> ----
> Application.get().getSessionStore().invalidate(RequestCycle.get().getRequest()
> );
> bind();
> ----
> 
> 
> ■困っていること
> 以下の操作を行なった際にPageExpiredErrorPageに遷移してしまいます。
> (本当は、以下の3でAページを表示したい)
> 1.認証が不要なページに存在する、Aページへのリンク(PageLinkコンポーネントを使
> 用)をクリック。
> 2.ログイン画面が表示されるので、ログインの操作を行なう。
> 3.PageExpiredErrorPageがブラウザに表示される
> 
> 
> ■分かっていること
> WebRequestCycleProcessor#resolve(final RequestCycle,final RequestParameters)内
>> target = resolveRenderedPage(requestCycle, requestParameters);の呼び出し結果が
> nullとなった
> 結果PageExpiredErrorPageに遷移することが分かっています。
> 
> 解析結果を踏まえますと、「セッションを作り直してしまった結果、URLと
> 遷移先ページの紐付けができない」という事象だと思われます。
> よって遷移先(ページA)がブックマーク可能なページであればこの問題は発生
> しないのですが、「認証が必要なページを全てブックマーク可能にする」というのは
> 解決策としてちょっと困りものです。
> 
> 何か良い解決策は無いでしょうか?
> 
> 以上、よろしくおねがいします。
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user




Wicket-ja-user メーリングリストの案内
Zurück zum Archiv-Index