概要
メッセージ(URI パス、クエリ パラメータ、ヘッダー、フォーム パラメータ、変数、XML ペイロード、JSON ペイロードなど)から情報を抽出し、その内容を事前定義済みの正規表現に対して評価します。特定の正規表現が true と評価された場合、メッセージは脅威とみなされ、拒否されます。
動画
Regular Expression Protection ポリシーの詳細については、次の動画をご覧ください。
動画 | 説明 |
---|---|
SQL インジェクション攻撃からの保護(New Edge) | New Edge エクスペリエンス UI では、Regular Expression Protection ポリシーを使用して SQL インジェクション攻撃から保護します。 |
SQL インジェクション攻撃からの保護(Classic Edge) | Classic Edge UI では、Regular Expression Protection ポリシーを使用して SQL インジェクション攻撃から保護します。 |
サンプル
GitHub
GitHub の正規表現保護のサンプルでは、クエリ パラメータを使用して SQL インジェクション攻撃の可能性を追跡する方法を示しています。また、ハッカーがレスポンスから有益な情報を得るのを防ぐために、一般的な 400 エラー ステータスを設定するための推奨事項も示しています。
JavaScript インクルード攻撃の防御
<RegularExpressionProtection name="JsonPathRegExProtection"> <DisplayName>Regular Expression Protection 1</DisplayName> <Source>request</Source> <JSONPayload escapeSlashCharacter="true"> <JSONPath> <Expression>$.</Expression> <Pattern><\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> </Pattern> <Pattern>n\s*\\\\\s*slash</Pattern> <Pattern>n\s*\/\s*slash</Pattern> <Pattern>n\s*\\"\s*quotes</Pattern> <Pattern>n\s*\\b\s*space</Pattern> <Pattern>n\s*\\f\s*forwardfeed</Pattern> <Pattern>n\s*\\n\s*newline</Pattern> <Pattern>n\s*\\r\s*carria</Pattern> <Pattern>n\s*\\t\s*tab</Pattern> <Pattern>n\s*\\uFFFF\s*hex</Pattern> </JSONPath> </JSONPayload> </RegularExpressionProtection>
上記のサンプルは、RegularExpressionProtection ポリシーを使用して、JavaScript インクルード攻撃の JSON ペイロードを評価する方法を示しています。具体的には、<JSONPath>
/ <Expression>
によって抽出されたコンテンツが <JSONPath>
/ <Pattern>
の正規表現に対して評価されます。
<JSONPath>
/ <Pattern>
の正規表現に XML 予約文字("、&、'、{、.)が含まれている場合は、ポリシーの XML 構成ファイルに含める前に XML エンコードを行う必要があります。たとえば、上記のサンプルでは、正規表現 <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
が <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
として XML エンコードされています。
また、正規表現にスラッシュ(/)が含まれる場合は、<JSONPayload>
escapeSlashCharacter
属性を true
に設定してエスケープする必要があります。
大文字と小文字を区別しないマッチング
大文字と小文字を区別しないマッチングを行うのは、一般的です。たとえば、(?i)
を使用する正規表現でこの処理を行います。この例では、DELETE
、delete
、Delete
は true と評価されます。
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
Regular Expression Protection ポリシーについて
Apigee Edge では、実行時に API トラフィックに対して評価できる正規表現を構成して、特定のパターンに従う一般的なコンテンツ レベルの脅威を特定できます。
正規表現(regex)は、文字列内のパターンを指定する文字列のセットです。正規表現を使用すると、コンテンツがプログラムでパターンについて評価されるようになります。たとえば、メールアドレスが適切に構成されていることを確認するために正規表現を使用できます。詳細については、Java チュートリアルの正規表現をご覧ください。
RegularExpressionProtection の最も一般的な使用方法は、悪意のあるコンテンツに関する JSON や XML ペイロードの評価です。
コンテンツ ベースの攻撃をすべて排除できる正規表現はなく、複数のメカニズムを組み合わせて多層防御を実現する必要があります。このセクションでは、コンテンツをブラックリストに登録するための推奨パターンについて説明します。
ブラックリスト パターンの例
正規表現は、ポリシーの XML 構成ファイルで、XML でエンコードされている必要があります。
名前 | 正規表現 |
---|---|
SQL インジェクション |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
サーバーサイド インクルード インジェクション |
<!--#(include|exec|echo|config|printenv)\s+.* XML エンコード: <!--#(include|exec|echo|config|printenv)\s+.* |
XPath 簡略構文インジェクション |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
XPath 拡張構文インジェクション |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
JavaScript インジェクション |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> XML エンコード: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> XSS の脅威からの保護パターンについては、こちらのコミュニティ投稿もご覧ください。 |
Java 例外インジェクション |
.*?Exception in thread.* |
リクエストで XML または JSON ペイロードを使用して Content-Type ヘッダーを設定する
Regular Expression Protection ポリシーのペイロードには、次の要素を含めることが可能です。
-
<XMLPayload>
要素: 情報を XML ペイロードから抽出し、提供される正規表現に対して評価する必要があることを指定します。ポリシーで
<XMLPayload>
を使用する場合、リクエストのContent-Type
ヘッダーはapplication/xml
やtext/xml
などの XML コンテンツ タイプにする必要があります。 -
<JSONPayload>
要素: 情報を JSON ペイロードから抽出し、提供される正規表現に対して評価する必要があることを指定します。ポリシーで
<JSONPayload>
を使用する場合、リクエストのContent-Type
ヘッダーはapplication/json
などの JSON コンテンツ タイプにする必要があります。
通常は、XML または JSON のいずれかを受け入れるように API を設計します。ただし、API が両方を受け入れるシナリオが存在することがあります。次に、<XMLPayload>
要素と <JSONPayload>
要素の両方を使用する Regular Expression Protection ポリシーを定義します。Content-Type
ヘッダーの値に基づいて特定のリクエストに適用される要素は 1 つだけです。
要素リファレンス
この要素リファレンスは、RegularExpressionProtection ポリシーの要素と属性について説明します。
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1"> <DisplayName>Regular Expression Protection 1</DisplayName> <Source>response</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath> <QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam> <Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header> <FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam> <Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable> <XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload> <JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload> </RegularExpressionProtection>
<RegularExpressionProtection> 属性
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
次の表に、すべてのポリシーの親要素に共通する属性を示します。
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗した場合にエラーを返すには、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<Source> 要素
情報を抽出する必要があるメッセージを示します。
<Source>
要素を省略すると、値はデフォルトで message
になります。例: <Source>message</Source>
。message
に設定すると、ポリシーはリクエスト フローに接続されたときにリクエスト メッセージをソースとして使用します。同様に、レスポンス フローに添付されたときは、レスポンス メッセージを使用します。
ソース メッセージを解決できない場合、またはメッセージ以外の型に解決される場合、ポリシーはエラーを返します。
<Source>response</Source>
デフォルト: | なし |
要否: | 省略可 |
型: | 文字列 |
<IgnoreUnresolvedVariables> 要素
解決できない変数が検出されたときにエラーを返すかどうかを指定します。
false
(デフォルト)に設定すると、解決できない変数が検出された場合にエラーが返されます。true
に設定すると、未解決の変数は空の文字列(Null)として扱われます。
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
デフォルト: | false |
要否: | 省略可 |
型: | ブール値 |
<URIPath> 要素
情報をリクエスト URI パスから抽出し、提供される正規表現に対して評価する必要があることを指定します。一致する正規表現パターンを指定する <Pattern>
要素を少なくとも 1 つ指定する必要があります。
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
<QueryParam> 要素
情報をリクエスト クエリ パラメータから抽出し、提供される正規表現に対して評価する必要があることを指定します。一致する正規表現パターンを指定する <Pattern>
要素を少なくとも 1 つ指定する必要があります。
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name | 提供される正規表現に対して評価するために情報を抽出する必要がある、リクエスト クエリ パラメータの名前。 | なし | 必須 |
<Header> 要素
情報をリクエスト ヘッダーとレスポンス ヘッダーから抽出し、提供される正規表現に対して評価する必要があることを指定します。一致する正規表現パターンを指定する <Pattern>
要素を少なくとも 1 つ指定する必要があります。
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
提供される正規表現に対して評価するために情報を抽出する必要がある、リクエストおよびリクエスト ヘッダーの名前。 |
なし | 必須 |
<FormParam> 要素
情報をリクエスト フォーム パラメータから抽出し、提供される正規表現に対して評価する必要があることを指定します。一致する正規表現パターンを指定する <Pattern>
要素を少なくとも 1 つ指定する必要があります。
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
提供される正規表現に対して評価するために情報を抽出する必要がある、リクエスト フォーム パラメータの名前。 |
なし | 必須 |
<Variable> 要素
特定の変数から情報を抽出し、提供される正規表現に対して評価する必要があることを指定します。
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
提供される正規表現に対して評価するために情報を抽出する必要がある、変数の名前。 |
なし | 必須 |
<XMLPayload> 要素
情報を XML ペイロードから抽出し、提供される正規表現に対して評価する必要があることを指定します。
<XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
<XMLPayload> / <Namespaces> 要素
XPath 評価で使用する名前空間を指定します。
<XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload>
デフォルト: | なし |
要否: | 省略可 |
型: | 文字列 |
<XMLPayload> / <Namespaces> / <Namespace> 要素
XPath 評価で使用する各名前空間を指定します。<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
デフォルト: | なし |
要否: | 省略可 |
型: | 文字列 |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
prefix |
特定の名前空間を修飾するための接頭辞を提供します。 |
なし | 必須 |
<XMLPayload> / <XPath> 要素
評価する XPath を指定します。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
<XMLPayload> / <XPath> / <Expression> 要素
変数に定義された XPath 式を指定します。XPath 1.0 式のみがサポートされています。たとえば、<Expression>/company/employee[@age>=$request.header.age]</Expression>
は年齢が request.header.age
で指定された値以上の従業員の詳細を抽出します。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
デフォルト: | なし |
要否: | 省略可 |
型: | 文字列 |
<XMLPayload> / <XPath> / <Type> 要素
データ型を指定します。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
デフォルト: | 文字列 |
要否: | 省略可 |
型: | 文字列 |
有効な値: |
文字列。有効な値として、 |
<XMLPayload> / <XPath> / <Pattern> 要素
正規表現パターンを定義します。<Pattern>
要素の正規表現に XML 予約文字("、&、'、{、.)が含まれている場合は、それを含める前に XML エンコードを行う必要があります。
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
デフォルト: | なし |
要否: | 必須 |
型: | 文字列 |
<JSONPayload> 要素
情報を JSON ペイロードから抽出し、提供される正規表現に対して評価する必要があることを指定します。
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
デフォルト: | なし |
要否: | 省略可 |
型: | なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
escapeSlashCharacter |
|
true | 省略可 |
<JSONPayload> / <JSONPath> / <Expression> 要素
変数に定義されている JSONPath 式を指定します。
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
デフォルト: | なし |
要否: | 省略可 |
型: | 文字列 |
<JSONPayload> / <JSONPath> / <Pattern> 要素
正規表現パターンを定義します。<Pattern>
要素の正規表現に XML 予約文字("、&、'、{、.)が含まれている場合は、それを含める前に XML エンコードを行う必要があります。
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
デフォルト: | なし |
要否: | 必須 |
型: | 文字列 |
エラー リファレンス
このセクションでは、このポリシーによってエラーがトリガーされたときに返されるエラーコードとメッセージ、Edge によって設定される障害変数について説明します。これは、障害に対処する障害ルールを作成するうえで重要な情報です。エラーをキャプチャして独自のカスタムエラーを発生させる場合は、ポリシールート要素で continueOnError="true"
属性を設定します。詳細については、ポリシーエラーについて知っておくべきことと障害の処理をご覧ください。
Edge ポリシーから返されるエラーは、エラーコード リファレンスで説明されている一貫した形式に従います。
ランタイム エラー
このエラーは、ポリシーの実行時に発生することがあります。
エラーコード | メッセージ |
---|---|
ExecutionFailed | RegularExpressionProtection StepDefinition {0} を実行できませんでした。理由: {1} |
InstantiationFailed | RegularExpressionProtection StepDefinition {0} をインスタンス化できませんでした |
NonMessageVariable | 変数 {0} がメッセージに解決されません |
SourceMessageNotAvailable | {0} メッセージは RegularExpressionProtection StepDefinition {1} に使用できません |
ThreatDetected | {0} で検出された正規表現の脅威: regex: {1} 入力: {2} |
VariableResolutionFailed | 変数 {0} を解決できませんでした |
デプロイエラー
エラーコード | メッセージ | 解決方法 |
---|---|---|
CannotBeConvertedToNodeset | RegularExpressionProtection {0}: xpath {1} の結果を nodeset に変換できません。コンテキスト {2} | build |
DuplicatePrefix | RegularExpressionProtection {0}: 重複接頭辞 {1} | build |
EmptyJSONPathExpression | RegularExpressionProtection {0}: 空の JSONPath 式 | build |
EmptyXPathExpression | RegularExpressionProtection {0}: 空の XPath 式 | build |
InvalidRegularExpression | RegularExpressionProtection {0}: 無効な正規表現 {1}、コンテキスト {2} | build |
JSONPathCompilationFailed | RegularExpressionProtection {0}: jsonpath {1} をコンパイルできませんでした。コンテキスト {2} | build |
NONEmptyPrefixMappedToEmptyURI | RegularExpressionProtection {0}: 空でない接頭辞 {1} を空の URI にマッピングできません。 | build |
NoPatternsToEnforce | RegularExpressionProtection {0}: {1} に適用するパターンはありません | build |
NothingToEnforce | RegularExpressionProtection {0}: URIPath、QueryParam、Header、FormParam、XMLPayload、JSONPayload の少なくとも 1 つが必須です | build |
XPathCompilationFailed | RegularExpressionProtection {0}: xpath {1} をコンパイルできませんでした。コンテキスト {2} | build |
障害変数
このポリシーがエラーをトリガーした場合は、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。
変数 | 説明 | 例 |
---|---|---|
fault.name="fault_name" |
fault_name は、上記の表に示されている障害の名前です。 | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name は、障害が発生したポリシーのユーザー指定の名前です。 | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |