セッションIDのふりなおし(Java, J2EE, resin)

1月 7, 2011 · Posted in J2EE, Resin · Comment 

目的

ユーザーのログイン前後で同じセッションIDが使われているのを、ログインのタイミングで新しいセッションIDを使うようにする。セッション・ハイジャック対策。

セッション・ハイジャックについて

セッションを用いたログイン管理を行なっているアプリケーションにおいて、攻撃者が用意したセッションIDをリクエストに含まされた正規の利用者が、正規の手順でログインすることで、不正なセッションIDを用いたログイン認証が行われてしまう。

環境

言語:java(J2EE)
サーバー:resin(http://www.caucho.com/)

結論

${RESIN_HOME}/conf/resin.confのsession-configに、

<reuse-session-id>false</reuse-session-id>

を追加。

流れ

某ECサイトで、ログイン前後で(というか、cookieの期限がすぎるまで)、同一のセッションIDがずっと使いまわされていることが判明。

ソースチェック。ログイン処理の際に、セッション無効化処理がコーディングされていることを確認。ということは、アプリケーションじゃなくて環境の問題?

request.getSession().invalidate();


ローカルでデバッグしてみたら、セッションIDがふりかわっていることを確認。

少し考えた末に、ローカルはTomcat, サーバではResinを使用していることを思い出す。

ドキュメントチェック

発見(http://www.caucho.com/resin-3.0/config/webapp.xtp#session-config

設定追加

<reuse-session-id>false</reuse-session-id>


完成!

というわけで、

・サーバ上だとデバッグしにくい。

J2EE

1月 1, 2003 · Posted in J2EE · Comment 

メモ

メモ – J2EEのトランザクション

1月 1, 2003 · Posted in J2EE · Comment 

JTA/JTS

トランザクション処理を実現するためのAPI
JTA:http://java.sun.com/j2ee/ja/jta/index.html
JTShttp://java.sun.com/j2ee/ja/jts/index.html
これを利用することで、複雑なトランザクション制御を実装することが可能となる。
※ただし、仕様も複雑。

EJBのトランザクション

EJB仕様では、いくつかのトランザクションが規定されている。
これを利用することで、JTA/JTSを用いた複雑な実装を行ことなく、手軽にトランザクション管理を実現することが出来る。

  • Required
  • RequiresNew
  • Mandatory
  • NotSupported
  • Supports
  • Never

Required

Beanがトランザクションの下にあるクライアントから呼び出された場合、そのトランザクションの一部として処理を行う。
Beanを呼び出したクライアントがトランザクションの下にない場合、新しいトランザクションを開始して処理を行う。

RequiresNew

Beanがトランザクションの下にあるクライアントから呼び出された場合、そのトランザクションを停止後、新たなトランザクションを開始してから処理を行う。処理が終了したら、停止したトランザクションを再開する。
Beanを呼び出したクライアントがトランザクションの下にない場合、新しいトランザクションを開始して処理を行う。

Mandatory

Beanがトランザクションの下にあるクライアントから呼び出された場合、そのトランザクションの一部として処理を行う。
Beanを呼び出したクライアントがトランザクションの下にない場合、TransactionRequiredException をスローする

Supports

Beanがトランザクションの下にあるクライアントから呼び出された場合、そのトランザクションの一部として処理を行う。
Beanを呼び出したクライアントがトランザクションの下にない場合、何も行わない。

NotSupported

Beanがトランザクションの下にあるクライアントから呼び出された場合、そのトランザクションを停止後、トランザクション管理外で処理を行う。処理が終了したら、停止したトランザクションを再開する。
Beanを呼び出したクライアントがトランザクションの下にない場合、何も行わない。

Never

Beanがトランザクションの下にあるクライアントから呼び出された場合、RemoteExceptionをスローする。
Beanを呼び出したクライアントがトランザクションの下にない場合、何も行わない。

※EJBのメソッドはトランザクション管理上で実行されない。

Springのトランザクション

EJBと同じ。

  • PROPAGATION_REQUIRED
  • PROPAGATION_SUPPORTS
  • PROPAGATION_MANDATORY
  • PROPAGATION_REQUIRES_NEW
  • PROPAGATION_NOT_SUPPORTED
  • PROPAGATION_NEVER