セッションIDのふりなおし(Java, J2EE, resin)
目的
ユーザーのログイン前後で同じセッション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>
↓
完成!
というわけで、
・サーバ上だとデバッグしにくい。
SLF4J(Simple Logging Facade for Java)
SLF4J。Javaのロギングフレームワークのトレンド。
様々なロギングライブラリのFacadeとして利用する。
環境設定(eclipse+maven2. 直接jarファイルを入手する場合は以下の手順は無視!)
1.eclipseにMaven2プラグインを導入する
m2eclipse
m2eclipse – EclipseでMaven2を利用するためのプラグイン
2.プロジェクトを作成してMavenの管理を有効にする
ファイル→新規→プロジェクト→その他→Javaプロジェクトを作成。作成したら、プロジェクトのコンテキストメニューから、「Maven]→「Enable Dependency Management」を選択。
3.pom.xmlの修正
プロジェクト上に作成されたpom.xmlを開き、Dependencyタブを選択する。
addボタンを押して、以下のように設定する。
- org.slf4jと入力→slf4j-apiを追加(本体)
今回の例ではSLF4Jとlogbackを連携させるため、logbackの必要ライブラリも同時に入手しておく。
実務などで、利用しない場合は不要。
- ch.qos.logbackと入力→logback-coreを追加(logback本体)
- ch.qos.logbackと入力→logback-classicを追加(slf4jとlogback連携用)
HelloWorld!
クイックスタート
Main.java
package sample;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.execute();
}
public void execute() {
Logger logger = LoggerFactory.getLogger(Main.class);
String message = "Hello SLF4J!";
logger.trace(message);
logger.debug(message);
logger.info(message);
logger.warn(message);
logger.error(message);
}
}
とりあえず、設定ファイルなしに実行。
コンソールにtraceを除くログが出力された。
コンフィグファイル(logback.xml)を作成してログ出力
デフォルトではdebugレベルに設定されているようなので、設定ファイルを追加してtraceログも出力してみる。
ライブラリにlogbackを利用しているのでクラスパス配下にlogback.xmlを追加。
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="sapmle.core">
<level value="INFO" />
</logger>
<root>
<level value="TRACE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
でた!
別のロギングライブラリを利用してみる
log4j。
依存関係の変更
- log4j(本体)
- slf4j-log4j(slf4jとlog4j連携用)
log4j用設定ファイル(log4j.properties)を設置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p %c{1} - %m%n
log4j.rootLogger=debug, stdout
コードは修正なし!!!!!!
その他
Log4jからlogbackへの乗り換えは、log4j.properties to logback.xml Translatorが便利!!
めでたしめでたし。
Hibernate Annotations アノテーションを使った効率の良いHibernate開発
従来のHibernate開発ではBeanとテーブルのマッピングを○○.hbm.xmlファイルに記述していたが、バージョン3.5より、アノテーションを利用した効率の良い利用方法がサポートされた。
Quickstart
Eclipse(JavaSE6)+MySQLで、利用するまでの手順
環境
-Eclipse
–m2eclipse(Eclipse用Maven2プラグイン)→設定方法
-JavaSE6
-MySQL(5.1.41)
手順
1.Eclipseの起動
2.Mavenプロジェクトの作成
シンプルプロジェクト。ロケーションを設定(デフォルトでOK)

GroupId, ArtifactIdを入力

GroupId:開発グループのID
ArtifactId:製品ID
ここまでいつもどおり。
3.依存プロダクトの入手(pom.xml)
生成されたプロジェクトのpom.xmlを右クリックし、コンテキストメニューからMaven→Add Dependencyを選択。

hibernate関係のライブラリ依存を設定する
Enter groupId, artifactId … の欄に、「org.hibernate」と入力。以下のプロダクトをそれぞれ選択する。
- org.hibernate : hibernate-core-3.3.2.GA.jar
- org.hibernate : hibernate-annotations-3.4.0.GA.jar
- org.hibernate : hibernate-entitymanager-3.4.0.GA.jar
おなじく、「mysql」と入力。以下のプロダクトを選択する。
- mysql : mysql-connector-java-5.1.12.jar
最後にSlf4j(ロギング)のライブラリ。「org.slf4j」と入力
- org.slf4j : slf4j-api-1.6.0.jar
- org.slf4j : slf4j-nop-1.6.0.jar
それぞれ、実行時の最新バージョンを選択すること。
ライブラリの更新
パッケージエクスプローラからプロジェクトを右クリックし、コンテキストメニューからMaven→Update Dependencyを選択。

ここまで3分くらい。
DBの用意
CREATE TABLE IF NOT EXISTS `emp` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; INSERT INTO `emp` (`id`, `name`) VALUES (1, 'たろう'), (2, 'じろう');
コンフィグファイル(hibernate.cfg.xml)の作成
Hibernateがデータベース接続をおこなうための設定ファイルをクラスパスが通っているディレクトリに格納する。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping package="sample" />
<mapping class="sample.Emp"/>
</session-factory>
</hibernate-configuration>
エンティティクラス(hibernate.cfg.xml)の作成
テーブルのレコードを表すクラス(エンティティクラス)を、sampleパッケージに生成
package sample;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "EMP")
public class Emp {
@Id
public Integer id;
public String name;
}
実行
実行用クラス。
package sample;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class Main {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.openSession();
List<Emp> empList = session.createCriteria(Emp.class).list();
for (Emp emp : empList) {
System.out.println(emp.name);
}
}
}
結果
Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from EMP this_
たろう
じろう
超簡単!
















