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

Back to archive index

Masaya seko masay****@nifty*****
2011年 3月 6日 (日) 00:12:54 JST


矢野様

世古です。
まず最初にお詫びを。
セッションの再作成は、セッションフィクセーション攻撃に関する対策ですよね。
CSRF対策と私が間違って書いてしまったがために、矢野様に両方の攻撃に対策を回答さ
せてしまうことになってしまい、申し訳ありませんでした。

今回質問した主題はセッションフィクセーション攻撃だったのですが、別件でCSRF対策
についても検討していたため助かりました。
ありがとうございます。

では気を取り直しまして。

■セッションの転写について
セッションの転写に回避については調査した結果、「私が解決したい問題を解決するの
は難しそうだ」という結論に至りました。
単純に古いセッションの情報を待避しておいて、新しいオブジェクトにコピーしても、
URLとPageの対応付けは動作しなかったです。
セッション破棄のタイミングで、ISessionStoreが破棄されるようで(HttpSessionBindi
ngListenerを実装したクラスが存在しておりそのクラスが破棄の仕事をする)密接に関
係しているっぽいIPageMapも無効になり、結局私の望む挙動はさせられないという……
。


■セッションフィクセーション攻撃(ログイン時にクッキーを発行する手法)
「セッションIDを変えなきゃ」と思っていた私にはびっくりですが、仰るとおりセッシ
ョンフィクセーション攻撃に耐性ありそうですね。
クッキーの使用を拒否していくるブラウザについては、何か対策(エラー画面を返すと
か)を考えないといけないのでそこが悩みどころにはなりそうです。


■CSRF対策(SessionのnextPageId()をオーバーライド)
これもびっくりですが、確かに有効的に思えます。
普通のForm(StatelessFormみたいなの以外)を使う限り、POST先のURLにはPageIDが入り
ますものね。
これは採用を前向きに考えます。


あとこれは余談です。
■セッションフィクセーション攻撃(最近考えていた別解)
「URLを元にPageクラスのインスタンスを生成したあとにセッションを作り直せば、URL
とPageの対応付けが失われてもいけるのでは」という発想の元、「ログイン成功時に、
セッションにフラグを立てておいて、遷移先ページのPage#onBeforeRender()あたりで
セッションを作り直そうか」なんて案を仲間内で話し合っています。
実際にやってみると、動くには動くのですが、ちょっとどきどき(駄目なケースを見落
としてないか?という観点で)です。

以上
----- Original Message -----
>From: Tsutomu Yano <t_yano****@me*****>
>Date: Fri, 04 Mar 2011 14:47:55 +0900
>To: wicke****@lists*****
>Subject: [Wicket-ja-user 514] Re:
> セッション再生成後のページ遷移
>
>
>矢野です。
>
> 直接的な回答でないので恐縮なのですが… 
> おそらく、旧セッションの内容を新セッションに複製しないと、うまく動かないと
思います。(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().getReques
t()
>> );
>> 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 mailing list
>Wicke****@lists*****
>http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user




Wicket-ja-user メーリングリストの案内
Back to archive index