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”のようにカンマ区切りで記述します。