クラス StrictHttpFirewall

  • 実装されたすべてのインターフェース:
    HttpFirewall

    public class StrictHttpFirewall
    extends java.lang.Object
    implements HttpFirewall

    RequestRejectedException で不審なリクエストを拒否する HttpFirewall の厳密な実装。

    次のルールがファイアウォールに適用されます。

    • 許可されていない HTTP メソッドを拒否します。これは HTTP 動詞の改ざんと XST 攻撃をブロックするように指定されています。setAllowedHttpMethods(Collection) を参照
    • セキュリティの制約を回避するために、正規化されていない URL を拒否します。この制約を無効にすることは非常に危険であると考えられるため、これを無効にする方法はありません。この動作を許可するいくつかのオプションは、ファイアウォールの前にリクエストを正規化するか、代わりに DefaultHttpFirewall を使用することです。リクエストの正規化は脆弱であり、リクエストが正規化ではなく拒否される理由に留意してください。
    • 出力可能な ASCII 文字ではない文字を含む URL を拒否します。この制約を無効にすることは非常に危険であると考えられるため、これを無効にする方法はありません。
    • セミコロンを含む URL を拒否します。setAllowSemicolon(boolean) を参照
    • URL エンコードされたスラッシュを含む URL を拒否します。setAllowUrlEncodedSlash(boolean) を参照
    • バックスラッシュを含む URL を拒否します。setAllowBackSlash(boolean) を参照
    • null 文字を含む URL を拒否します。setAllowNull(boolean) を参照
    • URL エンコードパーセントを含む URL を拒否します。setAllowUrlEncodedPercent(boolean) を参照
    • 許可されていないホストを拒否します。setAllowedHostnames(Predicate) を参照
    • 許可されていないヘッダー名を拒否します。setAllowedHeaderNames(Predicate) を参照
    • 許可されていないヘッダー値を拒否します。setAllowedHeaderValues(Predicate) を参照
    • 許可されていないパラメーター名を拒否します。setAllowedParameterNames(Predicate) を参照
    • 許可されていないパラメーター値を拒否します。setAllowedParameterValues(Predicate) を参照
    導入:
    4.2.4
    関連事項:
    DefaultHttpFirewall
    • コンストラクターのサマリー

      コンストラクター  
      コンストラクター 説明
      StrictHttpFirewall()
    • メソッドのサマリー

      すべてのメソッド   インスタンスメソッド   具象メソッド   非推奨のメソッド  
      修飾子と型 メソッド 説明
      java.util.Set<java.lang.String>getDecodedUrlBlacklist()
      エントリを追加 / 削除できる既存のデコードされた URL ブロックリストを提供します
      java.util.Set<java.lang.String>getDecodedUrlBlocklist()
      エントリを追加 / 削除できる既存のデコードされた URL ブロックリストを提供します
      java.util.Set<java.lang.String>getEncodedUrlBlacklist()
      使用すべきではありません。
      代わりに getEncodedUrlBlocklist() を使用してください
      java.util.Set<java.lang.String>getEncodedUrlBlocklist()
      からエントリを追加 / 削除できる既存のエンコードされた URL ブロックリストを提供します
      FirewalledRequestgetFirewalledRequest​(javax.servlet.http.HttpServletRequest request)
      フィルターチェーンを通過するリクエストオブジェクトを提供します。
      javax.servlet.http.HttpServletResponsegetFirewalledResponse​(javax.servlet.http.HttpServletResponse response)
      フィルターチェーンを通過するレスポンスを提供します。
      voidsetAllowBackSlash​(boolean allowBackSlash)
      バックスラッシュ "\" または URL エンコードされたバックスラッシュ "%5C" をパスで許可するかどうかを決定します。
      voidsetAllowedHeaderNames​(java.util.function.Predicate<java.lang.String> allowedHeaderNames)
      許可するヘッダー名を決定します。
      voidsetAllowedHeaderValues​(java.util.function.Predicate<java.lang.String> allowedHeaderValues)
      許可するヘッダー値を決定します。
      voidsetAllowedHostnames​(java.util.function.Predicate<java.lang.String> allowedHostnames)
      許可するホスト名を決定します。
      voidsetAllowedHttpMethods​(java.util.Collection<java.lang.String> allowedHttpMethods)
      許可する HTTP メソッドを決定します。
      voidsetAllowedParameterNames​(java.util.function.Predicate<java.lang.String> allowedParameterNames)
      許可するパラメーター名を決定します。
      voidsetAllowedParameterValues​(java.util.function.Predicate<java.lang.String> allowedParameterValues)
      許可するパラメーター値を決定します。
      voidsetAllowNull​(boolean allowNull)
      null "\ 0" または URL エンコードされた nul "%00" をパスで許可するかどうかを決定します。
      voidsetAllowSemicolon​(boolean allowSemicolon)
      URL でセミコロンを許可するかどうかを決定します(つまり
      voidsetAllowUrlEncodedDoubleSlash​(boolean allowUrlEncodedDoubleSlash)
      URL エンコードされた "%2F%2F" であるダブルスラッシュ "//" をパスで許可するかどうかを決定します。
      voidsetAllowUrlEncodedPercent​(boolean allowUrlEncodedPercent)
      URL エンコードされた "%25" であるパーセント "%" をパスで許可するかどうかを決定します。
      voidsetAllowUrlEncodedPeriod​(boolean allowUrlEncodedPeriod)
      期間 "." かどうかを決定します。つまり、URL エンコードされた "%2E" はパスで許可されるかどうかです。
      voidsetAllowUrlEncodedSlash​(boolean allowUrlEncodedSlash)
      URL エンコードされた "%2F" であるスラッシュ "/" をパスで許可するかどうかを決定します。
      voidsetUnsafeAllowAnyHttpMethod​(boolean unsafeAllowAnyHttpMethod)
      HTTP メソッドが許可されるかどうかを設定します。
      • クラス java.lang.Object から継承されたメソッド

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • コンストラクターの詳細

      • StrictHttpFirewall

        public StrictHttpFirewall()
    • メソッドの詳細

      • setUnsafeAllowAnyHttpMethod

        public void setUnsafeAllowAnyHttpMethod​(boolean unsafeAllowAnyHttpMethod)
        HTTP メソッドが許可されるかどうかを設定します。これが true に設定されている場合、HTTP メソッドの検証は実行されません。これにより、HTTP 動詞の改ざんと XST 攻撃までアプリケーションを開くことができます
        パラメーター:
        unsafeAllowAnyHttpMethod - true の場合、HTTP メソッド検証を無効にします。それ以外の場合は、デフォルトにリセットします。デフォルトは false です。
        導入:
        5.1
        関連事項:
        setAllowedHttpMethods(Collection)
      • setAllowedHttpMethods

        public void setAllowedHttpMethods​(java.util.Collection<java.lang.String> allowedHttpMethods)

        許可する HTTP メソッドを決定します。デフォルトでは、"DELETE"、"GET"、"HEAD"、"OPTIONS"、"PATCH"、"POST"、"PUT" が許可されます。

        パラメーター:
        allowedHttpMethods - 許可される HTTP メソッドの大文字と小文字を区別するコレクション。
        導入:
        5.1
        関連事項:
        setUnsafeAllowAnyHttpMethod(boolean)
      • setAllowSemicolon

        public void setAllowSemicolon​(boolean allowSemicolon)

        URL でセミコロンを許可するかどうかを決定します(つまり、マトリックス変数)。反映されたファイルダウンロード攻撃を実行しようとする一般的な方法であるため、デフォルトではこの動作を無効にします。また、URL ベースのセキュリティをバイパスする多くのエクスプロイトのソースです。

        例: 次の CVE は、CVE につながったセミコロンの処理方法に関するサーブレット仕様のあいまいさに関する課題のサブセットです。

        セミコロンを許可する場合は、セキュリティバイパスの非常に一般的なソースであるため、再考してください。ユーザーがセミコロンを必要とするいくつかの一般的な理由と代替が以下にリストされています

        • パスに JSESSIONID を含める -URL にセッション ID(または機密情報)を含めないでください。漏れが発生する可能性があります。代わりに Cookie を使用します。
        • 行列変数 - マトリックス変数を活用したいユーザーは、代わりに HTTP パラメーターの使用を検討する必要があります。
        パラメーター:
        allowSemicolon - URL にセミコロンを許可する必要があります。デフォルトは false
      • setAllowUrlEncodedSlash

        public void setAllowUrlEncodedSlash​(boolean allowUrlEncodedSlash)

        URL エンコードされた "%2F" であるスラッシュ "/" をパスで許可するかどうかを決定します。URL ベースのセキュリティを回避する一般的な方法であるため、デフォルトではこの動作を許可しません。

        例: サーブレット仕様のあいまいさが原因で、値が一貫して解析されず、HttpServletRequest パス関連の値が異なる値になり、特定のセキュリティ制約をバイパスできます。

        パラメーター:
        allowUrlEncodedSlash - URL エンコードされた "%2F" であるスラッシュ "/" がパスで許可されるかどうか。デフォルトは false です。
      • setAllowUrlEncodedDoubleSlash

        public void setAllowUrlEncodedDoubleSlash​(boolean allowUrlEncodedDoubleSlash)

        URL エンコードされた "%2F%2F" であるダブルスラッシュ "//" をパスで許可するかどうかを決定します。デフォルトでは許可しません。

        パラメーター:
        allowUrlEncodedDoubleSlash - パスで URL エンコードされた "%2F%2F" であるスラッシュ "//" が許可されているかどうか。デフォルトは false です。
      • setAllowUrlEncodedPeriod

        public void setAllowUrlEncodedPeriod​(boolean allowUrlEncodedPeriod)

        期間 "." かどうかを決定します。つまり、URL エンコードされた "%2E" はパスで許可されるかどうかです。デフォルトでは、セキュリティの悪用の頻繁なソースであるため、この動作を許可しません。

        例: サーブレット仕様のあいまいさが原因で、URL エンコードされた期間がディレクトリトラバーサル攻撃を介してセキュリティ制約をバイパスする可能性があります。これは、パスが一貫して解析されないため、特定のセキュリティ制約をバイパスできるように、HttpServletRequest パス関連の値に異なる値が生じるためです。

        パラメーター:
        allowUrlEncodedPeriod - ピリオド "." つまり、"%2E" でエンコードされた URL がパスで許可されているかどうかを確認します。デフォルトは false です。
      • setAllowBackSlash

        public void setAllowBackSlash​(boolean allowBackSlash)

        バックスラッシュ "\" または URL エンコードされたバックスラッシュ "%5C" をパスで許可するかどうかを決定します。デフォルトでは、セキュリティの悪用の頻繁な原因であるため、この動作は許可されていません。

        例: サーブレット仕様のあいまいさが原因で、URL エンコードされた期間がディレクトリトラバーサル攻撃を介してセキュリティ制約をバイパスする可能性があります。これは、パスが一貫して解析されないため、特定のセキュリティ制約をバイパスできるように、HttpServletRequest パス関連の値に異なる値が生じるためです。

        パラメーター:
        allowBackSlash - パスでは、円記号 "\" または URL エンコードされた円記号 "%5C" を使用できます。デフォルトは false です
      • setAllowNull

        public void setAllowNull​(boolean allowNull)

        null "\ 0" または URL エンコードされた nul "%00" をパスで許可するかどうかを決定します。デフォルトでは、セキュリティの悪用の頻繁な原因であるため、この動作は許可されていません。

        パラメーター:
        allowNull - パスに null "\ 0" または URL エンコードされた null "%00" を許可するかどうか。デフォルトは false です
        導入:
        5.4
      • setAllowUrlEncodedPercent

        public void setAllowUrlEncodedPercent​(boolean allowUrlEncodedPercent)

        URL エンコードされた "%25" であるパーセント "%" をパスで許可するかどうかを決定します。デフォルトでは、セキュリティの悪用の頻繁な原因であるため、この動作は許可されていません。

        例: これは、セキュリティ制約の回避につながる二重の URL エンコーディングを伴う悪用につながる可能性があります。

        パラメーター:
        allowUrlEncodedPercent - URL エンコードされた "%25" であるパーセント "%" をパスで許可する必要があるかどうか。デフォルトは false です
      • setAllowedHeaderNames

        public void setAllowedHeaderNames​(java.util.function.Predicate<java.lang.String> allowedHeaderNames)

        許可するヘッダー名を決定します。デフォルトでは、ISO 制御文字および定義されていない文字を含むヘッダー名は拒否されます。

        パラメーター:
        allowedHeaderNames - ヘッダー名をテストするための述語
        導入:
        5.4
        関連事項:
        Character.isISOControl(int)Character.isDefined(int)
      • setAllowedHeaderValues

        public void setAllowedHeaderValues​(java.util.function.Predicate<java.lang.String> allowedHeaderValues)

        許可するヘッダー値を決定します。デフォルトでは、ISO 制御文字と定義されていない文字を含むヘッダー値を拒否します。

        パラメーター:
        allowedHeaderValues - ホスト名をテストするための述語
        導入:
        5.4
        関連事項:
        Character.isISOControl(int)Character.isDefined(int)
      • setAllowedParameterNames

        public void setAllowedParameterNames​(java.util.function.Predicate<java.lang.String> allowedParameterNames)
        許可するパラメーター名を決定します。デフォルトでは、ISO 制御文字および定義されていない文字を含むヘッダー名は拒否されます。
        パラメーター:
        allowedParameterNames - パラメーター名をテストするための述語
        導入:
        5.4
        関連事項:
        Character.isISOControl(int)Character.isDefined(int)
      • setAllowedParameterValues

        public void setAllowedParameterValues​(java.util.function.Predicate<java.lang.String> allowedParameterValues)

        許可するパラメーター値を決定します。デフォルトでは、すべてのパラメーター値が許可されます。

        パラメーター:
        allowedParameterValues - パラメーター値をテストするための述語
        導入:
        5.4
      • setAllowedHostnames

        public void setAllowedHostnames​(java.util.function.Predicate<java.lang.String> allowedHostnames)

        許可するホスト名を決定します。デフォルトでは、任意のホスト名を許可します。

        パラメーター:
        allowedHostnames - ホスト名をテストするための述語
        導入:
        5.2
      • getFirewalledResponse

        public javax.servlet.http.HttpServletResponse getFirewalledResponse​(javax.servlet.http.HttpServletResponse response)
        インターフェースからコピーされた説明: HttpFirewall
        フィルターチェーンを通過するレスポンスを提供します。
        次で指定:
        インターフェース HttpFirewallgetFirewalledResponse 
        パラメーター:
        response - 元のレスポンス
        戻り値:
        元のレスポンスまたは置換 / ラッパーのいずれか。
      • getEncodedUrlBlocklist

        public java.util.Set<java.lang.String> getEncodedUrlBlocklist()
        からエントリを追加 / 削除できる既存のエンコードされた URL ブロックリストを提供します
        戻り値:
        既存のエンコードされた URL ブロックリスト、決して null
      • getDecodedUrlBlocklist

        public java.util.Set<java.lang.String> getDecodedUrlBlocklist()
        エントリを追加 / 削除できる既存のデコードされた URL ブロックリストを提供します
        戻り値:
        既存のデコードされた url ブロックリスト。null にはならない
      • getEncodedUrlBlacklist

        @Deprecated
        public java.util.Set<java.lang.String> getEncodedUrlBlacklist()
        使用すべきではありません。
        代わりに getEncodedUrlBlocklist() を使用してください
        からエントリを追加 / 削除できる既存のエンコードされた URL ブロックリストを提供します
        戻り値:
        既存のエンコードされた URL ブロックリスト、決して null
      • getDecodedUrlBlacklist

        public java.util.Set<java.lang.String> getDecodedUrlBlacklist()
        エントリを追加 / 削除できる既存のデコードされた URL ブロックリストを提供します
        戻り値:
        既存のデコードされた url ブロックリスト。null にはならない