コンテンツの検証

適用対象: すべての API Management レベル

validate-content ポリシーは 1 つ以上のサポートされているスキーマに対して、要求または応答の本文のサイズまたはコンテンツを検証します。

次の表は、ポリシーがサポートするスキーマ形式と要求または応答のコンテンツの種類を示しています。 コンテンツの種類の値では大文字と小文字が区別されません。

フォーマット コンテンツの種類
JSON 例: application/json
application/hal+json
XML 例: application/xml
SOAP 使用可能な値: application/soap+xml (SOAP 1.2 API の場合)
text/xml (SOAP 1.1 API の場合)

Note

この検証ポリシーで使用できる API スキーマの最大サイズは 4 MB です。 スキーマがこの制限を超えた場合、検証ポリシーは実行時にエラーを返します。 これを増やすには、サポートにお問い合わせください。

検証されるコンテンツ

ポリシーは、スキーマに対する要求または応答の次のコンテンツを検証します:

  • すべての必須プロパティの存在。
  • スキーマに additionalProperties フィールドが設定されている場合、追加のプロパティの有無。 allow-additional-properties 属性でオーバーライドされる場合があります。
  • すべてのプロパティのタイプ。 たとえば、スキーマでプロパティを整数として指定する場合、要求 (または応答) には整数を含める必要があり、文字列などの別の型は含めないようにする必要があります。
  • スキーマで指定されている場合のプロパティの形式 で、たとえば、正規表現 (patternキーワードが指定されている場合)、minimum整数など。

ヒント

スキーマで使用できる正規表現パターン制約の例については、OWASP 検証正規表現リポジトリを参照してください。

Note

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 このポリシーの構成に役立つ、ガイド付きのフォーム ベース エディターがポータルに用意されています。 API Management ポリシーを設定または編集する方法について説明します。

ポリシー ステートメント

<validate-content unspecified-content-type-action="ignore | prevent | detect" max-size="size in bytes" size-exceeded-action="ignore | prevent | detect" errors-variable-name="variable name">
    <content-type-map any-content-type-value="content type string" missing-content-type-value="content type string">
        <type from | when="content type string" to="content type string" />
    </content-type-map>
    <content type="content type string" validate-as="json | xml | soap" schema-id="schema id" schema-ref="#/local/reference/path" action="ignore | prevent | detect" allow-additional-properties="true | false" case-insensitive-property-names="true | false"/>
</validate-content>

属性

属性 説明 必要 Default
unspecified-content-type-action API スキーマで指定されていないコンテンツ タイプの要求または応答に対して実行するアクション。 ポリシー式を使用できます。 はい なし
max-size Content-Length ヘッダーに対してチェックされる、要求または応答の本文の最大長 (バイト単位)。 要求本文または応答本文が圧縮されている場合、この値は圧縮解除された長さになります。 許可される最大値: 4 MB。 ポリシー式を使用できます。 はい なし
size-exceeded-action 本文が max-size で指定されたサイズを超えている要求または応答に対して実行するアクション。 ポリシー式を使用できます。 はい なし
errors-variable-name 検証エラーをログに記録する context.Variables の変数の名前。 ポリシー式は使用できません。 いいえ 該当なし

要素

名前 説明 必須
content-type-map この要素を追加して、受信要求または応答のコンテンツ タイプを、検証をトリガーするために使用される別のコンテンツ タイプにマップします。 いいえ
コンテンツ これらの要素を 1 つ以上追加して、要求または応答のコンテンツ タイプまたはマップされたコンテンツ タイプを検証し、指定されたアクションを実行します。 いいえ

content-type-map の属性

属性 説明 必要 Default
any-content-type-value 受信コンテンツ タイプに関係なく、要求または応答の本文の検証に使用されるコンテンツ タイプ。 ポリシー式は使用できません。 いいえ 該当なし
missing-content-type-value 受信コンテンツ タイプが見つからないか空の場合に、要求または応答の本文の検証に使用されるコンテンツ タイプ。 ポリシー式は使用できません。 いいえ 該当なし

content-type-map-elements

名前 説明 必須
type これらの要素を 1 つ以上追加して、受信コンテンツ タイプを、要求または応答の本文の検証に使用されるコンテンツ タイプにマップします。 from を使用して既知の受信コンテンツ タイプを指定するか、when とポリシー式を使用して、条件に一致する受信コンテンツ タイプを指定します。 指定されている場合に、any-content-type-valuemissing-content-type-value のマッピングをオーバーライドします。 いいえ

content の属性

属性 説明 必要 Default
type 本文の検証を実行するコンテンツ タイプ。指定されている場合は、コンテンツ タイプ ヘッダーまたは content-type-mapping でマップされている値に対してチェックされます。 空の場合は、API スキーマで指定されているすべてのコンテンツ タイプに適用されます。

SOAP 要求と応答を検証するには (validate-as 属性が "soap" に設定されます)、SOAP 1.2 API の場合は typeapplication/soap+xml に設定し、SOAP 1.1 API の場合は text/xml に設定します。
いいえ なし
validate-as type が一致する要求または応答の本文の検証に使用する検証エンジン。 サポートされている値: "json"、"xml"、"soap"。

"soap" を指定すると、要求または応答の XML が SOAP エンベロープから抽出され、XML スキーマに対して検証されます。
はい 該当なし
schema-id コンテンツの検証のために API Management インスタンスに追加された既存のスキーマの名前。 指定しない場合、API 定義の既定のスキーマが使用されます。 いいえ 該当なし
schema-ref schema-id で指定されたJSON スキーマの場合は、JSON ドキュメント内の有効なローカル参照パスへの省略可能な参照。 例: #/components/schemas/address. この属性は、API Management が有効な JSON スキーマとして処理する JSON オブジェクトを返します。

XML スキーマの場合、schema-ref はサポートされておらず、最上位レベルのスキーマ要素を VML 要求または応答ペイロードのルートとして使用できます。 検証では、XML 要求または応答のペイロード ルートから始まるすべての要素が、指定された XML スキーマに準拠しているかどうかがチェックされます。
いいえ 該当なし
allow-additional-properties ブール値。 JSON スキーマの場合、スキーマで構成された additionalProperties 値のランタイム オーバーライドを実装するかどうかを指定します。
- true: JSON スキーマの additionalProperties フィールドが追加のプロパティを許可しないように構成されている場合でも、要求または応答本文で追加のプロパティを許可します。
- false: JSON スキーマの additionalProperties フィールドが追加のプロパティを許可するように構成されている場合でも、要求または応答本文で追加のプロパティを許可しません。

属性が指定されていない場合、ポリシーはスキーマ内の additionalProperties フィールドの構成に従って追加のプロパティを検証します。
いいえ N/A
case-insensitive-property-names ブール値。 JSON スキーマの場合、大文字と小文字を区別せずに JSON オブジェクトのプロパティ名を比較するかどうかを指定します。
- true: 大文字と小文字を区別しないでプロパティ名を比較します。
- false: 大文字と小文字を区別してプロパティ名を比較します。
いいえ false

アクション

コンテンツ検証ポリシーには、API 要求または応答内のエンティティを API スキーマに対して検証するときに API Management によって行われるアクションを指定する属性が 1 つ以上含まれています。

  • アクションは、API スキーマで表されている要素に対して指定できます。ポリシーによっては、API スキーマで表されていない要素に対しても指定できます。

  • ポリシーの子要素に指定されたアクションは、その親に対して指定されたアクションをオーバーライドします。

使用可能なアクション:

アクション 説明
ignore 検証をスキップします。
回避 (prevent) 要求または応答の処理をブロックし、詳細な検証エラーをログに記録して、エラーを返します。 最初のエラー セットが検出されると、処理が中断されます。
検出 (detect) 要求または応答の処理を中断することなく、検証エラーをログに記録します。

使用

ログ

ポリシー実行中の検証エラーの詳細は、 ポリシーのルート要素の errors-variable-name 属性で指定されている context.Variables の変数に記録されます。 prevent アクションで構成されている場合、検証エラーによってその後の要求または応答の処理がブロックされ、検証エラーは context.LastError プロパティにも反映されます。

エラーを調査するには、 トレース ポリシーを使用して、コンテキスト変数から Application Insights にエラーを記録します。

パフォーマンスへの影響

検証ポリシーを追加すると、API のスループットに影響を与える可能性があります。 一般論としては、次のような原則があります。

  • API スキーマのサイズが大きいほど、スループットが低下します。
  • 要求または応答のペイロードが大きいほど、スループットが低下します。
  • API スキーマのサイズは、ペイロードのサイズよりもパフォーマンスに大きな影響を与えます。
  • 数メガバイトのサイズの API スキーマに対して検証を行うと、一部の条件下で要求または応答のタイムアウトが発生する可能性があります。 影響は、サービスの従量課金レベルと開発者レベルでより顕著になります。

API スループットに対する検証ポリシーの影響を評価するには、想定される運用ワークロードでロード テストを実行することをお勧めします。

コンテンツ検証用のスキーマ

既定では、要求または応答のコンテンツの検証では、API 定義の JSON または XML のスキーマが使用されます。 これらのスキーマは、OpenAPI または WSDL 仕様から API Management に API をインポートするときに、手動で指定することも、自動的に生成することもできます。

validate-content ポリシーを使用すると、必要に応じて、API Management インスタンスに追加し、API 定義の一部になっていない 1 つ以上の JSON スキーマまたは XML スキーマに対して検証を行うことができます。 API Management に追加したスキーマは、多くの API で再利用できます。

Azure portal を使用して API Management インスタンスにスキーマを追加するには、次のようにします。

  1. portal で、API Management インスタンスに移動します。

  2. 左側のメニューの [API] セクションで、[スキーマ]>[+ 追加] を選択します。

  3. [スキーマの作成] ウィンドウで、次の操作を行います。

    1. スキーマの名前 (ID) を入力します。
    2. [スキーマの種類] で、[JSON] または [XML] を選択します。
    3. [Description](説明) を入力します。
    4. [フォルダーの作成] で、次のいずれかの操作を行います。
      • [新規作成] を選択し、スキーマを入力するか貼り付けます。
      • [ファイルからインポート] または [URL からインポートする] を選択し、スキーマの場所を入力します。

        注意

        URL からスキーマをインポートするには、ブラウザーからインターネット経由でスキーマにアクセスできる必要があります。

    5. [保存] を選択します。

    スキーマの作成

API Management により、相対 URI /schemas/<schemaId> にスキーマ リソースが追加され、[スキーマ] ページのリストにスキーマが表示されます。 スキーマを選択してプロパティを表示するか、スキーマ エディターで編集します。

注意

スキーマは、API Management インスタンスに追加された別のスキーマを相互参照する場合があります。 たとえば、次のような要素を使用して、API Management に追加された XML スキーマを含めます。

<xs:include schemaLocation="/schemas/myschema" />

ヒント

WSDL および XSD スキーマの参照を解決し、生成されたスキーマを API Management に一括インポートするためのオープン ソース ツールが GitHub で提供されています。

JSON スキーマの検証

次の例では、API Management は、コンテンツ タイプが空の要求、またはコンテンツ タイプのヘッダーが application/hal+json の要求を、コンテンツ タイプ application/json の要求として解釈します。 その後で、API Management は、API 定義で application/json コンテンツ タイプに対して定義されているスキーマに対して、検出モードで検証を実行します。 ペイロードが 100 KB を超えるメッセージはブロックされます。 スキーマの additionalProperties フィールドが追加のプロパティを許可するように構成されている場合でも、追加のプロパティを含む要求はブロックされます。

<validate-content unspecified-content-type-action="prevent" max-size="102400" size-exceeded-action="prevent" errors-variable-name="requestBodyValidation">
    <content-type-map missing-content-type-value="application/json">
        <type from="application/hal+json" to="application/json" />
    </content-type-map>
    <content type="application/json" validate-as="json" action="detect" allow-additional-properties="false" />
</validate-content>

SOAP スキーマの検証

次の例では、API Management は、受信コンテンツ タイプに関係なくどの要求も、コンテンツ タイプ application/soap+xml (SOAP 1.2 API によって使用されるコンテンツ タイプ) の要求として解釈します。 要求は、空のコンテンツ タイプ ヘッダー、text/xml のコンテンツ タイプヘッダー (SOAP 1.1 API で使用される)、または別のコンテンツ タイプ ヘッダーで受信することがあります。 次に、API Management は SOAP エンベロープから XML ペイロードを抽出し、"myschema" という名前のスキーマに対して防止モードの検証を実行します。 ペイロードが 100 KB を超えるメッセージはブロックされます。

<validate-content unspecified-content-type-action="prevent" max-size="102400" size-exceeded-action="prevent" errors-variable-name="requestBodyValidation">
    <content-type-map any-content-type-value="application/soap+xml" />
    <content type="application/soap+xml" validate-as="soap" schema-id="myschema" action="prevent" /> 
</validate-content>

検証エラー

API Management では、次の形式でコンテンツ検証エラーが生成されます。

{
 "Name": string,
 "Type": string,
 "ValidationRule": string,
 "Details": string,
 "Action": string
}

次の表に、検証ポリシーで発生する可能性があるすべてのエラーを示します。

  • 詳細: エラーを調査するために使用できます。 一般に共有するためのものではありません。
  • パブリック応答: クライアントに返されるエラー。 実装の詳細は漏えいしません。

検証ポリシーで prevent アクションを指定し、エラーが発生すると、API Management からの応答には、受信セクションでポリシーが適用されている場合は HTTP 状態コード 400、送信セクションでポリシーが適用されている場合は 502 が含まれます。

名前 Type 検証規則 詳細 パブリック応答 操作
validate-content
RequestBody SizeLimit 要求の本文の長さは {size} バイトで、構成されている制限の {maxSize} バイトを超えています。 要求の本文の長さは {size} バイトで、制限の {maxSize} バイトを超えています。 検出 (detect) /回避 (prevent)
ResponseBody SizeLimit 応答の本文の長さは {size} バイトで、構成されている制限の {maxSize} バイトを超えています。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{messageContentType} RequestBody 指定されていません。 指定されていないコンテンツ タイプ {messageContentType} は許可されません。 指定されていないコンテンツ タイプ {messageContentType} は許可されません。 検出 (detect) /回避 (prevent)
{messageContentType} ResponseBody 指定されていません。 指定されていないコンテンツ タイプ {messageContentType} は許可されません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
ApiSchema API のスキーマが存在しないか、解決できませんでした。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
ApiSchema API のスキーマで定義が指定されていません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{messageContentType} RequestBody / ResponseBody MissingDefinition API のスキーマに、コンテンツ タイプ {messageContentType} に関連付けられている定義 {definitionName} が含まれていません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{messageContentType} RequestBody IncorrectMessage 要求の本文が、コンテンツ タイプ {messageContentType} に関連付けられている定義 {definitionName} に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
要求の本文が、コンテンツ タイプ {messageContentType} に関連付けられている定義 {definitionName} に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
検出 (detect) /回避 (prevent)
{messageContentType} ResponseBody IncorrectMessage 応答の本文が、コンテンツ タイプ {messageContentType} に関連付けられている定義 {definitionName} に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
RequestBody ValidationException コンテンツ タイプ {messageContentType} に対して、要求の本文を検証できません。

{exception details}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
ResponseBody ValidationException コンテンツ タイプ {messageContentType} に対して、応答の本文を検証できません。

{exception details}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
validate-parameters / validate-headers
{paramName} / {headerName} QueryParameter / PathParameter / RequestHeader 指定されていません。 指定されていない {path parameter / query parameter / header} {paramName} は許可されません。 指定されていない {path parameter / query parameter / header} {paramName} は許可されません。 検出 (detect) /回避 (prevent)
{headerName} ResponseHeader 指定されていません。 指定されていないヘッダー {headerName} は許可されません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
ApiSchema API のスキーマが存在しないか、解決できませんでした。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
ApiSchema API スキーマで定義が指定されていません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{paramName} QueryParameter / PathParameter / RequestHeader / ResponseHeader MissingDefinition API のスキーマに、{query parameter / path parameter / header} {paramName} に関連付けられている定義 {definitionName} が含まれていません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage 要求では、{query parameter / path parameter / header} {paramName} に対して複数の値を含めることはできません。 要求では、{query parameter / path parameter / header} {paramName} に対して複数の値を含めることはできません。 検出 (detect) /回避 (prevent)
{headerName} ResponseHeader IncorrectMessage 応答では、ヘッダー {headerName} に対して複数の値を含めることはできません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage {query parameter / path parameter / header} {paramName} の値が定義に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
{query parameter / path parameter / header} {paramName} の値が定義に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
検出 (detect) /回避 (prevent)
{headerName} ResponseHeader IncorrectMessage ヘッダー {headerName} の値が定義に準拠していません。

{valError.Message} 行: {valError.LineNumber}、位置: {valError.LinePosition}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage {query parameter / path parameter / header} {paramName} の値を、定義に従って解析できません。

{ex.Message}
{query parameter / path parameter / header} {paramName} の値を、定義に従って解析できませんでした。

{ex.Message}
検出 (detect) /回避 (prevent)
{headerName} ResponseHeader IncorrectMessage ヘッダー {headerName} の値を、定義に従って解析できませんでした。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{paramName} QueryParameter / PathParameter / RequestHeader ValidationError {Query parameter / Path parameter / Header} {paramName} を検証できません。

{exception details}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
{headerName} ResponseHeader ValidationError ヘッダー {headerName} を検証できません。

{exception details}
内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)
validate-status-code
{status-code} StatusCode 指定されていません。 応答状態コード {status-code} は許可されません。 内部エラーにより、要求を処理できませんでした。 API の所有者に問い合わせてください。 検出 (detect) /回避 (prevent)

次の表に、検証エラーで考えられるすべての原因の値と、考えられるメッセージの値を示します。

理由 メッセージ
正しくない要求 {詳細} (コンテキスト変数用)、{パブリック応答} (クライアント用)
応答が許可されない {詳細} (コンテキスト変数用)、{パブリック応答} (クライアント用)

ポリシーに対する処理の詳細については、次のトピックを参照してください。