RegularExpressionProtection ポリシー

概要

メッセージ(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>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;
          </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*>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt; として XML エンコードされています。

また、正規表現にスラッシュ(/)が含まれる場合は、<JSONPayload> escapeSlashCharacter 属性を true に設定してエスケープする必要があります。

大文字と小文字を区別しないマッチング

大文字と小文字を区別しないマッチングを行うのは、一般的です。たとえば、(?i) を使用する正規表現でこの処理を行います。この例では、DELETEdeleteDelete は 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 エンコード:


&lt;!--#(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 エンコード:


&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;

XSS の脅威からの保護パターンについては、こちらのコミュニティ投稿もご覧ください。

Java 例外インジェクション

.*?Exception in thread.*

リクエストで XML または JSON ペイロードを使用して Content-Type ヘッダーを設定する

Regular Expression Protection ポリシーのペイロードには、次の要素を含めることが可能です。

  • <XMLPayload> 要素: 情報を XML ペイロードから抽出し、提供される正規表現に対して評価する必要があることを指定します。

    ポリシーで <XMLPayload> を使用する場合、リクエストの Content-Type ヘッダーは application/xmltext/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

ポリシーの内部名。name 属性の値には、文字、数字、スペース、ハイフン、アンダースコア、ピリオドを使用できます。255 文字を超える値を指定することはできません。

必要に応じて、管理 UI プロキシ エディタで <DisplayName> 要素を使用してポリシーに別のわかりやすい名前でラベルを付けます。

なし 必須
continueOnError

ポリシーが失敗した場合にエラーを返すには、false に設定します。これはほとんどのポリシーで想定される動作です。

ポリシーが失敗してもフロー実行を続行するには、true に設定します。

false 省略可
enabled

ポリシーを適用するには true に設定します。

ポリシーを無効にするには false に設定します。その場合、ポリシーはフローに接続されていているとしても適用されません。

true 省略可
async

この属性は非推奨となりました。

false 非推奨

<DisplayName> 要素

name 属性に加えて、管理 UI プロキシ エディタのポリシーに別のわかりやすい名前でラベルを付けるために使います。

<DisplayName>Policy Display Name</DisplayName>
デフォルト:

なし

この要素を省略した場合、ポリシーの name 属性の値が使用されます

要否: 省略可
型: 文字列

<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>
デフォルト: 文字列
要否: 省略可
型: 文字列
有効な値:

文字列。有効な値として、stringbooleanintlongfloatdoublenodeset などがあります。

<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

<JSONPath> / <Pattern> の正規表現に含まれるスラッシュ(/)をエスケープするには、true に設定します。

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>
デフォルト: なし
要否: 必須
型: 文字列

エラー リファレンス

This section describes the error codes and messages returned and fault variables set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. If you want to capture an error and raise your own custom error, set the continueOnError="true" attribute on the policy root element. To learn more, see What you need to know about policy errors and Handling faults.

Errors returned from Edge policies follow a consistent format as described in the Error code reference.

Runtime errors

These errors can occur when the policy executes.

Error Code Message
ExecutionFailed Failed to execute the RegularExpressionProtection StepDefinition {0}. Reason: {1}
InstantiationFailed Failed to instantiate the RegularExpressionProtection StepDefinition {0}
NonMessageVariable Variable {0} does not resolve to a Message
SourceMessageNotAvailable {0} message is not available for RegularExpressionProtection StepDefinition {1}
ThreatDetected Regular Expression Threat Detected in {0}: regex: {1} input: {2}
VariableResolutionFailed Failed to resolve variable {0}

Deployment errors

Error Code Message Fix
CannotBeConvertedToNodeset RegularExpressionProtection {0}: Result of xpath {1} cannot be converted to nodeset. Context {2}
DuplicatePrefix RegularExpressionProtection {0}: Duplicate prefix {1}
EmptyJSONPathExpression RegularExpressionProtection {0}: Empty JSONPath expression
EmptyXPathExpression RegularExpressionProtection {0}: Empty XPath expression
InvalidRegularExpression RegularExpressionProtection {0}: Invalid Regular Expression {1}, Context {2}
JSONPathCompilationFailed RegularExpressionProtection {0}: Failed to compile jsonpath {1}. Context {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: Non-empty prefix {1} cannot be mapped to empty uri
NoPatternsToEnforce RegularExpressionProtection {0}: No patterns to enforce in {1}
NothingToEnforce RegularExpressionProtection {0}: at least one of URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload is mandatory
XPathCompilationFailed RegularExpressionProtection {0}: Failed to compile xpath {1}. Context {2}

Fault variables

These variables are set when this policy triggers an error. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the table above. fault.name Matches "ThreatDetected"
regularexpressionprotection.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. regularexpressionprotection.Regular-Expressions-Protection-1.failed = true

スキーマ

関連トピック

JSON Threat Protection ポリシー

XML Threat Protection ポリシー