intra-mart Accel Platform SAStruts+S2JDBC プログラミングガイド 第16版 2019-12-01

CSRF対策

概要

Cross-Site Request Forgery(以下CSRF)対策として、 intra-mart Accel Platform では imSecureTokenタグ を用意しています。 このタグにより生成されるトークンに対してサーバ側でトークンチェック処理を行うことにより、CSRF対策を行います。 ここでは、CSRF対策を実施したいメソッドにトークンチェック処理をインターセプターを使って実行する方法について説明します。

imSecureTokenタグを使ったCSRF対策

imSecureTokenタグでは、CSRF対策の方法としてトークンを使います。 jspのformにimSecureTokenタグを記述する、ajaxで送信するデータにトークンをセットするなどをして、 サーバに送信するリクエストにトークンをセットします。 サーバ側でトークンチェック処理を実装し、リクエストのトークンの検証を行い、CSRF対策を行います。

imSecureTokenタグでは、トークンチェック処理について2つの方法を紹介しています。

  • token-filtering-target-configのxmlに設定を記述し、トークンチェック処理を自動で行う方法
  • ユーザでトークンチェック処理を実装する方法

ここでは、後者の「ユーザでトークンチェック処理を実装する方法」をインターセプターを使って実行する方法を紹介します。

インターセプターを使ってトークンチェック処理を実行する方法

ここでは単純な登録処理を例にCSRF対策の方法を説明します。

対象となるファイル

  • 入力フォームのjsp
  • 登録処理のActionクラス
  • app.diconファイル
  • customizer.diconファイル

注意

ここでは、 intra-mart Accel Platform 2014 Winter(Iceberg) で導入されたSecureTokenValidationInterceptorを利用しています。 お使いの intra-mart Accel Platform が 2014 Winter(Iceberg) 以上であることを確認してください。

入力フォームのjsp

入力フォームにimSecureTokenタグを追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<%@page pageEncoding="UTF-8"%>
<%@ taglib prefix="imui"   uri="http://www.intra-mart.co.jp/taglib/imui"%>
<%@ taglib prefix="imst" uri="http://www.intra-mart.co.jp/taglib/imst" %>

<imui:head>
  <title>登録</title>
</imui:head>

<div class="imui-title">
  <h1>登録</h1>
</div>

<div class="imui-form-container-narrow">
  <form name="doRegisterForm" action="todo/register/doRegister" method="POST">
     <!-- 入力フォームにimSecureTokenタグを追加 -->
     <imst:imSecureToken />

     ...

  </form>
</div>

登録処理のActionクラス

登録処理を行うメソッド名をdoRegisterにします。このメソッド名は後述のcustomizer.diconの設定と一致させます。

ここではインターセプトするメソッド名をdoRegisterとしています。適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    /**
     * 登録処理
     * 
     * @return index
     */
    @Execute(validator = true, input = "index")
    public String doRegister() {

        // 登録処理

        return index();
    }

app.diconファイル

secureTokenValidationInterceptorコンポーネント定義を追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "https://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="convention.dicon"/>
    <include path="aop.dicon"/>
    <include path="j2ee.dicon"/>
    <!--
    <include path="s2jdbc.dicon"/>
    -->
    <component name="actionMessagesThrowsInterceptor" class="org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor"/>

    <component name="secureTokenValidationInterceptor"
            class="jp.co.intra_mart.framework.extension.seasar.struts.interceptor.SecureTokenValidationInterceptor"
            instance="prototype">
        <aspect pointcut="invoke">
            <component class="org.seasar.framework.aop.interceptors.InterceptorLifecycleAdapter" />
        </aspect>
    </component>

</components>

customizer.diconファイル

actionCustomizerにsecureTokenValidationInterceptorを追加します。

ここでは、対象となるActionのメソッド名としてdoRegisterを設定しています。適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    <component name="actionCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addAspectCustomizer">
            <arg>"aop.traceInterceptor"</arg>
        </initMethod>
        <initMethod name="addAspectCustomizer">
            <arg>"actionMessagesThrowsInterceptor"</arg>
        </initMethod>
        <initMethod name="addAspectCustomizer">
            <arg>"secureTokenValidationInterceptor"</arg>
            <arg>"doRegister"</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>
                <component
                    class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/>
            </arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>
                <component
                    class="org.seasar.struts.customizer.ActionCustomizer"/>
            </arg>
        </initMethod>
    </component>

コラム

複数のメソッドを設定する場合は、”doRegister, doUpdate, doRemove”のようにカンマ区切りで記述します。