クラス StrictHttpFirewall
- java.lang.Object
-
- org.springframework.security.web.firewall.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 ブロックリストを提供しますFirewalledRequest
getFirewalledRequest(javax.servlet.http.HttpServletRequest request)
フィルターチェーンを通過するリクエストオブジェクトを提供します。javax.servlet.http.HttpServletResponse
getFirewalledResponse(javax.servlet.http.HttpServletResponse response)
フィルターチェーンを通過するレスポンスを提供します。void
setAllowBackSlash(boolean allowBackSlash)
パス内でバックスラッシュ "\" or a URL encoded backslash "%5C" を許可するかどうかを決定します。void
setAllowedHeaderNames(java.util.function.Predicate<java.lang.String> allowedHeaderNames)
許可するヘッダー名を決定します。void
setAllowedHeaderValues(java.util.function.Predicate<java.lang.String> allowedHeaderValues)
許可するヘッダー値を決定します。void
setAllowedHostnames(java.util.function.Predicate<java.lang.String> allowedHostnames)
許可するホスト名を決定します。void
setAllowedHttpMethods(java.util.Collection<java.lang.String> allowedHttpMethods)
許可する HTTP メソッドを決定します。void
setAllowedParameterNames(java.util.function.Predicate<java.lang.String> allowedParameterNames)
許可するパラメーター名を決定します。void
setAllowedParameterValues(java.util.function.Predicate<java.lang.String> allowedParameterValues)
許可するパラメーター値を決定します。void
setAllowNull(boolean allowNull)
パス内で null "\0" or a URL encoded nul "%00" を許可するかどうかを決定します。void
setAllowSemicolon(boolean allowSemicolon)
URL でセミコロンを許可するかどうかを決定します(つまりvoid
setAllowUrlEncodedCarriageReturn(boolean allowUrlEncodedCarriageReturn)
URL エンコードされたキャリッジリターンがパスで許可されるかどうかを決定します。void
setAllowUrlEncodedDoubleSlash(boolean allowUrlEncodedDoubleSlash)
URL エンコードされた "%2F%2F" であるダブルスラッシュ "//" をパスで許可するかどうかを決定します。void
setAllowUrlEncodedLineFeed(boolean allowUrlEncodedLineFeed)
パスで URL エンコードされたラインフィードを許可するかどうかを決定します。void
setAllowUrlEncodedLineSeparator(boolean allowUrlEncodedLineSeparator)
パスで URL エンコードされた行セパレーターを許可するかどうかを決定します。void
setAllowUrlEncodedParagraphSeparator(boolean allowUrlEncodedParagraphSeparator)
URL エンコードされた段落区切り文字をパスで許可するかどうかを決定します。void
setAllowUrlEncodedPercent(boolean allowUrlEncodedPercent)
URL エンコードされた "%25" であるパーセント "%" をパスで許可するかどうかを決定します。void
setAllowUrlEncodedPeriod(boolean allowUrlEncodedPeriod)
期間 "." かどうかを決定します。つまり、URL エンコードされた "%2E" はパスで許可されるかどうかです。void
setAllowUrlEncodedSlash(boolean allowUrlEncodedSlash)
URL エンコードされた "%2F" であるスラッシュ "/" をパスで許可するかどうかを決定します。void
setUnsafeAllowAnyHttpMethod(boolean unsafeAllowAnyHttpMethod)
HTTP メソッドが許可されるかどうかを設定します。
メソッドの詳細
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)
パス内でバックスラッシュ "\" or a URL encoded backslash "%5C" を許可するかどうかを決定します。この動作はセキュリティ上の脆弱性の原因となることが多いため、デフォルトでは許可されません。
例: サーブレット仕様のあいまいさが原因で、URL エンコードされた期間がディレクトリトラバーサル攻撃を介してセキュリティ制約をバイパスする可能性があります。これは、パスが一貫して解析されないため、特定のセキュリティ制約をバイパスできるように、
HttpServletRequest
パス関連の値に異なる値が生じるためです。- パラメーター:
allowBackSlash
- パスにバックスラッシュ "\" or a URL encoded backslash "%5C" を許可するかどうかを指定します。デフォルトは false です
setAllowNull
public void setAllowNull(boolean allowNull)
パス内で null "\0" or a URL encoded nul "%00" を許可するかどうかを決定します。この動作はセキュリティ上の脆弱性の原因となることが多いため、デフォルトでは許可されません。
- パラメーター:
allowNull
- パスに null"\0" or a URL encoded null "%00" を許可するかどうか。デフォルトは false です- 導入:
- 5.4
setAllowUrlEncodedPercent
public void setAllowUrlEncodedPercent(boolean allowUrlEncodedPercent)
URL エンコードされた "%25" であるパーセント "%" をパスで許可するかどうかを決定します。デフォルトでは、セキュリティの悪用の頻繁な原因であるため、この動作は許可されていません。
例: これは、セキュリティ制約の回避につながる二重の URL エンコーディングを伴う悪用につながる可能性があります。
- パラメーター:
allowUrlEncodedPercent
- URL エンコードされた "%25" であるパーセント "%" をパスで許可する必要があるかどうか。デフォルトは false です
setAllowUrlEncodedCarriageReturn
public void setAllowUrlEncodedCarriageReturn(boolean allowUrlEncodedCarriageReturn)
URL エンコードされたキャリッジリターンがパスで許可されるかどうかを決定します。これはセキュリティエクスプロイトの頻繁な発生源であるため、デフォルトではこの動作を許可していません。- パラメーター:
allowUrlEncodedCarriageReturn
- URL エンコードされたキャリッジリターンが URL で許可されているかどうか。デフォルトは false です。
setAllowUrlEncodedLineFeed
public void setAllowUrlEncodedLineFeed(boolean allowUrlEncodedLineFeed)
パスで URL エンコードされたラインフィードを許可するかどうかを決定します。これはセキュリティエクスプロイトの頻繁な発生源であるため、デフォルトではこの動作を許可していません。- パラメーター:
allowUrlEncodedLineFeed
- URL エンコードされたラインフィードが URL で許可されているかどうか。デフォルトは false です。
setAllowUrlEncodedParagraphSeparator
public void setAllowUrlEncodedParagraphSeparator(boolean allowUrlEncodedParagraphSeparator)
URL エンコードされた段落区切り文字をパスで許可するかどうかを決定します。これはセキュリティエクスプロイトの頻繁な発生源であるため、デフォルトではこの動作を許可していません。- パラメーター:
allowUrlEncodedParagraphSeparator
- URL エンコードされた段落区切り文字が URL で許可されているかどうか。デフォルトは false です。
setAllowUrlEncodedLineSeparator
public void setAllowUrlEncodedLineSeparator(boolean allowUrlEncodedLineSeparator)
パスで URL エンコードされた行セパレーターを許可するかどうかを決定します。これはセキュリティエクスプロイトの頻繁な発生源であるため、デフォルトではこの動作を許可していません。- パラメーター:
allowUrlEncodedLineSeparator
- URL でエンコードされた行セパレーターが URL で許可されているかどうか。デフォルトは 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
getFirewalledRequest
public FirewalledRequest getFirewalledRequest(javax.servlet.http.HttpServletRequest request) throws RequestRejectedException
インターフェースからコピーされた説明:HttpFirewall
フィルターチェーンを通過するリクエストオブジェクトを提供します。- 次で指定:
- インターフェース
HttpFirewall
のgetFirewalledRequest
- 例外:
RequestRejectedException
- リクエストをすぐに拒否する必要がある場合
getFirewalledResponse
public javax.servlet.http.HttpServletResponse getFirewalledResponse(javax.servlet.http.HttpServletResponse response)
インターフェースからコピーされた説明:HttpFirewall
フィルターチェーンを通過するレスポンスを提供します。- 次で指定:
- インターフェース
HttpFirewall
のgetFirewalledResponse
- パラメーター:
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 にはならない