Web UI フレームワークのセキュリティー - CSRF 攻撃に対する保護

CSRF 攻撃から保護するには、Web UI フレームワークで以下の手順を使用します。

手順

  1. web.xml ファイルを開きます。
  2. CSRF 攻撃から保護するために使用されるトークンを検証するには、アプリケーションで登録される要求バリデーターを作成します (web.xml ファイルにまだバリデーターが存在しない場合)。

    例:

    <context-param>
      <param-name>scui-request-validator-10</param-name>
      <param-value>
    com.sterlingcommerce.ui.web.platform.security.SCUICSRFTokenValidator
      </param-value>
    </context-param>
  3. バリデーターが稼働できるモードを、以下のようにセットアップします。
    • ALL - POST 要求と GET 要求の両方で、CSRF トークンが検証されます。
    • POST (デフォルト) - POST 要求のみで CSRF トークンが検証されます。
    • NONE - バリデーターは、どの要求でも CSRF トークンを検証しません。

    config.xml ファイルまたは web.xml ファイルのコンテキスト・パラメーターで、バリデーター・モードを指定できます (web.xml ファイルにまだバリデーター・モードが存在しない場合)。

    モードが指定されていない場合、または検証モード用のコンテキスト・パラメーターが指定されていない場合、モードはデフォルトで POST になります。 IBM® では、要求の検証に POST モードを使用することをお勧めします。

    例:

    <context-param>
       <param-name>scui-csrf-validator-request-method</param-name>
       <param-value>ALL</param-value>
    </context-param>
  4. 必要な場合、以下のガイドラインを使用して、バリデーター用の URI (Universal Resource Indicator) 包含リストおよび除外リストをセットアップします。
    • URI が除外リストにある場合、CSRF トークンの検証は行われません。
    • URI が包含リストにあり、除外リストにはない場合、CSRF トークンの検証が行われます。
    web.xml ファイル内の以下のコンテキスト・パラメーターを使用して、包含および除外のリストを作成します。 パラメーターはいくつでも指定できます。
    • csrf-include-uri

      この値と同じ URI を持つ要求は、CSRF トークンの検証が行われます。

      例 (web.xml の場合):

      <context-param>
         <param-name>csrf.include.uri.endswith.stk.1</param-name>
         <param-value>.do</param-value>
      </context-param>
    • csrf-include-uri-endswith

      この値で終了する URI を持つ要求は、CSRF トークンの検証が行われます。

      例 (web.xml の場合):

      <context-param>
        <param-name>csrf.include.uri.endswith.stk.2</param-name>
        <param-value>.xml</param-value>
      </context-param>
    • csrf-include-uri-regex

      regex (パラメーターの値として指定) に一致する URI を持つ要求は、CSRF トークンの検証が行われます。

      例 (web.xml の場合):

      <context-param>
        <param-name>csrf.include.uri.stk.1</param-name>
        <param-value>/stk/home.jsp</param-value>
      </context-param>
    • csrf-bypass-uri

      この値に一致する URI を持つ要求はバイパスされ、CSRF トークンは検査されません。

      例 (web.xml の場合):

      <context-param>
        <param-name>csrf.bypass.uri.stk.1</param-name>
        <param-value>/console/login.jsp</param-value>
      </context-param>
    • csrf-bypass-uri-endswith

      この値で終了する URI を持つ要求は、バイパスされます。

      例 (web.xml の場合):

      <context-param>
         <param-name>csrf.bypass.uri.endswith.stk.1</param-name>
         <param-value>.js</param-value>
      </context-param>
    • csrf-bypass-uri-regex

      regex (パラメーターの値として指定) に一致する URI を持つ要求は、CSRF トークンは検査されません。

      例 (web.xml の場合):

      <context-param>
         <param-name>csrf.bypass.uri.regex.stk.1</param-name>
         <param-value>[a-zA-Z0-0]*servlet/param-value> 
      </context-param>

    デフォルトでは、csrf-include パラメーターが指定されない場合でも、すべての URI が包含リストに含まれます。 URI が除外リストに存在することは、明示的に指定する必要があります。 包含リストが指定されていない場合、デフォルトでは、すべての URI が包含リストに含まれているものと見なされます。 すべての URI が CSRF トークンの検証対象になるのを避けるために、アプリケーションで特定の URI を包含リストに追加できます。

    フレームワークでは、デフォルトで、gif、png、css、または js タイプのファイルを対象にした要求の CSRF 検証をバイパスするために除外リストを提供しています。

  5. ほとんどの CSRF 攻撃は、単に POST 要求をその同等の GET 要求に複製することによって機能します。 大抵のアプリケーションは POST 要求と GET 要求とを区別していないため、攻撃は通常機能します。 GET 要求と POST 要求とを区別するには、Struts アクションの定義で、アクションの requestMethodSupported パラメーターを使用して、バリデーターが稼働できるモードを以下のようにセットアップします。
    • POST - (デフォルト) POST 要求のみ許可されます。

      requestMethodSupported が設定されていないか、不明値である場合は、デフォルトで POST になります。

    • ALL - GET 要求と POST 要求の両方が許可されます。

    例:

    <action name="accountTransfer" class="com.AccountTransfer">
      <param name="requestMethodSupported">POST</param>
      <param name="resourceId">AccountTransfer_Action002</param>
    </action>