Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
PLATÍ PRO: Všechny úrovně služby API Management
Zásada validate-content ověří velikost nebo obsah (nebo obojí) textu požadavku nebo odpovědi na jedno nebo více podporovaných schémat.
Následující tabulka ukazuje formáty schématu a typy obsahu požadavků nebo odpovědí, které zásady podporují. Hodnoty typu obsahu nerozlišují malá a velká písmena.
| Formát | Typy obsahu |
|---|---|
| JSON | Příklady: application/jsonapplication/hal+json |
| jazyk XML | Příklad: application/xml |
| SOAP | Povolené hodnoty: application/soap+xml pro rozhraní API SOAP 1.2text/xml pro rozhraní API SOAP 1.1 |
Poznámka:
Maximální velikost schématu rozhraní API, které lze použít touto zásadou ověřování, je 4 MB. Pokud schéma tento limit překročí, zásady ověřování vrátí chyby za běhu. Pokud ho chcete zvýšit, obraťte se na podporu.
Jaký obsah je ověřený
Zásada ověří následující obsah v požadavku nebo odpovědi na základě schématu:
- Přítomnost všech požadovaných vlastností.
- Přítomnost nebo absence dalších vlastností, pokud má schéma nastaveno
additionalPropertiespole. Lze přepsat atributemallow-additional-properties. - Typy všech vlastností. Pokud například schéma určuje vlastnost jako celé číslo, požadavek (nebo odpověď) musí obsahovat celé číslo a ne jiný typ, například řetězec.
- Formát vlastností, pokud je zadán ve schématu – například regulární výraz (pokud
patternje zadán klíčové slovo),minimumpro celá čísla atd.
Návod
Příklady omezení vzoru regulárních výrazů, která se dají použít ve schématech, najdete v tématu Úložiště regulárních výrazů ověřování OWASP.
Poznámka:
Nastavte prvky zásad a podřízené prvky v pořadí uvedeném v prohlášení o zásadách. Portál poskytuje průvodce editorem založeným na formulářích, který vám pomůže s konfigurací této zásady. Přečtěte si další informace o tom, jak nastavit nebo upravit zásady služby API Management.
Prohlášení o zásadách
<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>
Atributy
| Atribut | Popis | Požaduje se | Výchozí |
|---|---|---|---|
| nezadaná akce typu obsahu | Akce , která se má provést u požadavků nebo odpovědí s typem obsahu, který není zadaný ve schématu rozhraní API Výrazy zásad jsou povolené. | Ano | – |
| max-size | Maximální délka textu požadavku nebo odpovědi v bajtech, zaškrtnutá v hlavičce Content-Length . Pokud je text požadavku nebo text odpovědi komprimovaný, jedná se o dekompresovanou délku. Maximální povolená hodnota: 4 MB. Výrazy zásad jsou povolené. |
Ano | – |
| akce s překročením velikosti |
Akce , která se má provést pro požadavky nebo odpovědi, jejichž text překračuje velikost uvedenou v max-size. Výrazy zásad jsou povolené. |
Ano | – |
| errors-variable-name | Název proměnné context.Variables , do které se protokoluje chyby ověření. Výrazy zásad nejsou povolené. |
Ne | – |
Elementy
| Název | Popis | Požaduje se |
|---|---|---|
| content-type-map | Přidejte tento prvek pro mapování typu obsahu příchozího požadavku nebo odpovědi na jiný typ obsahu, který se používá k aktivaci ověření. | Ne |
| obsah | Přidejte jeden nebo více těchto prvků pro ověření typu obsahu v požadavku nebo odpovědi nebo mapovaného typu obsahu a provedení zadané akce. | Ne |
atributy mapování typu obsahu
| Atribut | Popis | Požaduje se | Výchozí |
|---|---|---|---|
| any-content-type-value | Typ obsahu používaný k ověření textu požadavku nebo odpovědi bez ohledu na typ příchozího obsahu. Výrazy zásad nejsou povolené. | Ne | – |
| missing-content-type-value | Typ obsahu používaný k ověření textu požadavku nebo odpovědi, pokud typ příchozího obsahu chybí nebo je prázdný. Výrazy zásad nejsou povolené. | Ne | – |
content-type-map-elements
| Název | Popis | Požaduje se |
|---|---|---|
| typ | Přidejte jeden nebo více těchto prvků pro mapování příchozího typu obsahu na typ obsahu, který se používá k ověření textu požadavku nebo odpovědi. Slouží from k zadání známého typu příchozího obsahu nebo použití when s výrazem zásady k určení libovolného příchozího typu obsahu, který odpovídá podmínce. Přepíše mapování v any-content-type-value zadaném formátu a missing-content-type-value, pokud je zadáno. |
Ne |
atributy obsahu
Důležité
Propojený přístup se nekontroluje, když je schéma odkazováno pomocí schema-id. Uživatel, který má oprávnění psát politiku, může odkazovat na jakékoli dostupné schéma a způsobit, že správa API ověří požadavky nebo odpovědi vůči svým pravidlům, včetně detekce nebo blokování nesouladního obsahu, i když uživatel nemá přístup ke zdroji schématu ke čtení. To neumožňuje zobrazit ani upravit definici schématu.
Akce
Zásady ověřování obsahu zahrnují jeden nebo více atributů, které určují akci, kterou služba API Management provádí při ověřování entity v požadavku rozhraní API nebo odpovědi vůči schématu rozhraní API.
Pro elementy, které jsou reprezentované ve schématu rozhraní API, může být zadána akce a v závislosti na zásadách pro elementy, které nejsou reprezentovány ve schématu rozhraní API.
Akce zadaná v podřízené elementu zásady přepíše akci zadanou pro nadřazenou položku.
Dostupné akce:
| Akce | Popis |
|---|---|
| ignorovat | Přeskočte ověření. |
| zabránit | Zablokujte zpracování požadavku nebo odpovědi, zakažte podrobnou chybu ověření a vraťte chybu. Zpracování se přeruší při zjištění první sady chyb. |
| rozpoznat | Chyby ověření protokolu bez přerušení zpracování požadavků nebo odpovědí |
Využití
- Oddíly zásad: příchozí, odchozí, při chybě
- Obory zásad: globální, pracovní prostor, produkt, rozhraní API, operace
- Brány: Classic, v2, consumption, self-host, workspace
Protokoly
Podrobnosti o chybách ověřování během provádění zásad jsou zaznamenány do proměnné zadané context.Variables v errors-variable-name atributu v kořenovém elementu zásady. Při konfiguraci v prevent akci blokuje chyba ověření další zpracování požadavku nebo odpovědi a je také rozšířena do context.LastError vlastnosti.
K prošetření chyb použijte zásadu trasování k protokolování chyb z kontextových proměnných do Application Insights.
Vliv na výkon
Přidání zásady ověření může mít vliv na propustnost rozhraní API. Platí následující obecné principy:
- Čím větší je velikost schématu rozhraní API, tím nižší bude propustnost.
- Čím větší je datová část v požadavku nebo odpovědi, tím nižší bude propustnost.
- Velikost schématu rozhraní API má větší vliv na výkon než velikost datové části.
- Ověření vůči schématu rozhraní API, které má velikost několika megabajtů, může způsobit vypršení časového limitu požadavků nebo odpovědí za určitých podmínek. Účinek je výraznější v úrovních Consumption a Developer služby.
Doporučujeme provádět zátěžové testy s očekávanými produkčními úlohami, abyste posoudili dopad zásad ověřování na propustnost rozhraní API.
Schémata pro ověření obsahu
Ve výchozím nastavení používá ověřování obsahu požadavku nebo odpovědi schémata JSON nebo XML z definice rozhraní API. Tato schémata je možné zadat ručně nebo generovat automaticky při importu rozhraní API ze specifikace OpenAPI nebo WSDL do služby API Management.
validate-content Pomocí zásad můžete volitelně ověřit jedno nebo více schémat JSON nebo XML, která jste přidali do instance služby API Management a která nejsou součástí definice rozhraní API. Schéma, které přidáte do služby API Management, je možné opakovaně používat v mnoha rozhraních API.
Přidání schématu do instance služby API Management pomocí webu Azure Portal:
V části Rozhraní API v nabídce vlevo vyberte Schémata> + Přidat.
V okně Vytvořit schéma udělejte toto:
- Zadejte název (ID) schématu.
- V typu schématu vyberte JSON nebo XML.
- Zadejte popis.
- V metodě Create proveďte jednu z následujících věcí:
- Vyberte Vytvořit nový a zadejte nebo vložte schéma.
- Vyberte Importovat ze souboru nebo Importovat z adresy URL a zadejte umístění schématu.
Poznámka:
Pokud chcete importovat schéma z adresy URL, musí být schéma přístupné přes internet z prohlížeče.
- Zvolte Uložit.
Služba API Management přidá prostředek schématu do relativního identifikátoru URI /schemas/<schemaId>a schéma se zobrazí v seznamu na stránce Schémata . Vyberte schéma pro zobrazení jeho vlastností nebo úprav v editoru schématu.
Poznámka:
Schéma může křížově odkazovat na jiné schéma, které je přidáno do instance služby API Management. Zahrnout například schéma XML přidané do služby API Management pomocí elementu podobného:<xs:include schemaLocation="/schemas/myschema" />
Návod
Opensourcové nástroje pro překlad odkazů na schématu WSDL a XSD a dávkového importu generovaných schémat do služby API Management jsou k dispozici na GitHubu.
Příklady
Ověřování schématu JSON
V následujícím příkladu služba API Management interpretuje požadavky s prázdnou hlavičkou typu obsahu nebo požadavky s hlavičkou application/hal+json typu obsahu jako požadavky s typem application/jsonobsahu . Pak služba API Management provede ověření v režimu detekce vůči schématu definovanému application/json pro typ obsahu v definici rozhraní API. Zprávy s datovými částmi většími než 100 kB jsou blokované. Požadavky obsahující další vlastnosti jsou blokované, i když je pole schématu additionalProperties nakonfigurované tak, aby umožňovalo další vlastnosti.
<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>
Ověřování schématu SOAP
V následujícím příkladu služba API Management interpretuje jakýkoli požadavek jako požadavek s typem application/soap+xml obsahu (typ obsahu, který používá rozhraní API SOAP 1.2), bez ohledu na typ příchozího obsahu. Požadavek by mohl přijít s prázdnou hlavičkou typu obsahu, hlavičkou text/xml typu obsahu (používanou rozhraními API SOAP 1.1) nebo jinou hlavičkou typu obsahu. Služba API Management pak extrahuje datovou část XML z obálky SOAP a provede ověření v režimu prevence proti schématu s názvem myschema. Zprávy s datovými částmi většími než 100 kB jsou blokované.
<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>
Kompletní příklad zásad s ověřením obsahu
Následující příklad ukazuje úplný dokument zásad pro rozhraní API objednávky zákazníka, který používá validate-content k ověření příchozích požadavků a odchozích odpovědí. Zásady před předáním dat do back-endu ověřují, že datové části objednávek zákazníka odpovídají customer-order-schema (přidané do služby API Management) a také ověří, že potvrzení objednávky back-endu odpovídá očekávanému schématu, ale zjišťuje pouze problémy, nikoli je blokuje.
<policies>
<inbound>
<base />
<!-- Authenticate the request -->
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
<openid-config url="https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration" />
<audiences>
<audience>api://customer-orders</audience>
</audiences>
</validate-jwt>
<!-- Rate limit per subscription -->
<rate-limit-by-key calls="100" renewal-period="60" counter-key="@(context.Subscription.Id)" />
<!-- Validate incoming order request -->
<validate-content unspecified-content-type-action="prevent" max-size="524288" size-exceeded-action="prevent" errors-variable-name="requestValidationErrors">
<content type="application/json" validate-as="json" schema-id="customer-order-schema" action="prevent" allow-additional-properties="false" />
</validate-content>
<!-- Set backend URL -->
<set-backend-service base-url="https://orders-backend.contoso.com/api" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<!-- Validate backend response -->
<validate-content unspecified-content-type-action="detect" max-size="1048576" size-exceeded-action="detect" errors-variable-name="responseValidationErrors">
<content type="application/json" validate-as="json" schema-id="order-confirmation-schema" action="detect" />
</validate-content>
<!-- Add custom header to indicate validation passed -->
<set-header name="X-Content-Validated" exists-action="override">
<value>true</value>
</set-header>
</outbound>
<on-error>
<base />
<!-- Return validation errors in a structured format -->
<choose>
<when condition="@(context.Variables.ContainsKey("requestValidationErrors"))">
<return-response>
<set-status code="400" reason="Bad Request" />
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
<set-body>@{
var errors = (IEnumerable<object>)context.Variables["requestValidationErrors"];
return JsonConvert.SerializeObject(new {
error = "Request validation failed",
details = errors
});
}</set-body>
</return-response>
</when>
</choose>
</on-error>
</policies>
Chyby ověření
Služba API Management generuje chyby ověření obsahu v následujícím formátu:
{
"Name": string,
"Type": string,
"ValidationRule": string,
"Details": string,
"Action": string
}
Následující tabulka uvádí všechny možné chyby zásad ověřování.
- Podrobnosti: Je možné použít k prošetření chyb. Nemělo by se sdílet veřejně.
- Veřejná odpověď: Chyba vrácená klientovi. Nedochází k úniku podrobností implementace.
Když zásada ověření určuje prevent akci a vygeneruje chybu, odpověď ze služby API Management obsahuje stavový kód HTTP: 400, když se zásada použije v příchozí části, a 502, když se zásada použije v odchozím oddílu.
| Název | Typ | Ověřovací pravidlo | Podrobnosti | Veřejná odpověď | Akce |
|---|---|---|---|---|---|
| validate-content | |||||
| Tělo žádosti | SizeLimit | Text požadavku je {size} bajtů dlouhý a překračuje nakonfigurovaný limit počtu bajtů {maxSize}. | Text požadavku je {size} bajtů dlouhý a překračuje limit {maxSize} bajtů. | detekce nebo prevence | |
| ResponseBody | SizeLimit | Text odpovědi má délku {size} bajtů a překračuje nakonfigurovaný limit počtu bajtů {maxSize}. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | |
| {messageContentType} | Tělo žádosti | Nespecifikovaný | Zadaný typ obsahu {messageContentType} není povolený. | Zadaný typ obsahu {messageContentType} není povolený. | detekce nebo prevence |
| {messageContentType} | ResponseBody | Nespecifikovaný | Zadaný typ obsahu {messageContentType} není povolený. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| ApiSchema | Schéma rozhraní API neexistuje nebo ho nelze přeložit. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | ||
| ApiSchema | Schéma rozhraní API nezadává definice. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | ||
| {messageContentType} | RequestBody / ResponseBody | MissingDefinition | Schéma rozhraní API neobsahuje definici {definitionName}, která je přidružena k typu obsahu {messageContentType}. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {messageContentType} | Tělo žádosti | Nesprávná zpráva | Text požadavku neodpovídá definici {definitionName}, která je přidružena k typu obsahu {messageContentType}. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
Text požadavku neodpovídá definici {definitionName}, která je přidružena k typu obsahu {messageContentType}. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
detekce nebo prevence |
| {messageContentType} | ResponseBody | Nesprávná zpráva | Text odpovědi neodpovídá definici {definitionName}, která je přidružena k typu obsahu {messageContentType}. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| Tělo žádosti | ValidationException | Text požadavku nelze ověřit pro typ obsahu {messageContentType}. {podrobnosti o výjimce} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | |
| ResponseBody | ValidationException | Text odpovědi nelze ověřit pro typ obsahu {messageContentType}. {podrobnosti o výjimce} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | |
| validate-parameters / validate-headers | |||||
| {paramName} / {headerName} | QueryParameter / PathParameter / RequestHeader | Nespecifikovaný | Zadaný parametr {path / parametr dotazu / header} {paramName} není povolený. | Zadaný parametr {path / parametr dotazu / header} {paramName} není povolený. | detekce nebo prevence |
| {headerName} | HlavickaOdpovědi | Nespecifikovaný | Nezadaná hlavička {headerName} není povolená. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| ApiSchema | Schéma rozhraní API neexistuje nebo ho nelze přeložit. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | ||
| ApiSchema | Schéma rozhraní API nezadává definice. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence | ||
| {paramName} | QueryParameter / PathParameter / RequestHeader / ResponseHeader | MissingDefinition | Schéma rozhraní API neobsahuje definici {definitionName}, která je přidružená k {parametru dotazu / parametru cesty / header} {paramName}. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {paramName} | QueryParameter / PathParameter / RequestHeader | Nesprávná zpráva | Požadavek nemůže obsahovat více hodnot pro {parametr dotazu / parametr cesty / header} {paramName}. | Požadavek nemůže obsahovat více hodnot pro {parametr dotazu / parametr cesty / header} {paramName}. | detekce nebo prevence |
| {headerName} | HlavickaOdpovědi | Nesprávná zpráva | Odpověď nemůže obsahovat více hodnot hlavičky {headerName}. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {paramName} | QueryParameter / PathParameter / RequestHeader | Nesprávná zpráva | Hodnota parametru dotazu / parametru cesty / header} {paramName} neodpovídá definici. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
Hodnota parametru dotazu / parametru cesty / header} {paramName} neodpovídá definici. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
detekce nebo prevence |
| {headerName} | HlavickaOdpovědi | Nesprávná zpráva | Hodnota hlavičky {headerName} neodpovídá definici. Řádek {valError.Message}: {valError.LineNumber}, pozice: {valError.LinePosition} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {paramName} | QueryParameter / PathParameter / RequestHeader | Nesprávná zpráva | Hodnotu parametru dotazu / parametru cesty / header} {paramName} nelze analyzovat podle definice. {ex. Zpráva} |
Hodnotu parametru dotazu / parametru cesty / header} {paramName} nelze analyzovat podle definice. {ex. Zpráva} |
detekce nebo prevence |
| {headerName} | HlavickaOdpovědi | Nesprávná zpráva | Hodnotu hlavičky {headerName} nelze analyzovat podle definice. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {paramName} | QueryParameter / PathParameter / RequestHeader | Chyba ověření | {Parametr dotazu / Parametr cesty / Header} {paramName} nelze ověřit. {podrobnosti o výjimce} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| {headerName} | HlavickaOdpovědi | Chyba ověření | Hlavičku {headerName} nelze ověřit. {podrobnosti o výjimce} |
Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
| validate-status-code | |||||
| {status-code} | kód stavu | Nespecifikovaný | Stavový kód odpovědi {status-code} není povolen. | Požadavek nelze zpracovat kvůli vnitřní chybě. Obraťte se na vlastníka rozhraní API. | detekce nebo prevence |
V následující tabulce jsou uvedeny všechny možné hodnoty důvodu chyby ověření spolu s možnými hodnotami zpráv:
| Důvod | Zpráva |
|---|---|
| Chybný požadavek | {Details} pro kontextovou proměnnou, {Public response} pro klienta |
| Odpověď není povolena. | {Details} pro kontextovou proměnnou, {Public response} pro klienta |
Související zásady
Související obsah
Další informace o práci se zásadami najdete v tématech:
- Kurz: Transformace a ochrana rozhraní API
- Referenční informace o zásadách pro úplný seznam prohlášení o zásadách a jejich nastavení
- Výrazy zásad
- Nastavení nebo úprava zásad
- Opakované použití konfigurací zásad
- Úložiště fragmentů zásad
- úložiště ukázek Policy
- Sada nástrojů zásad služby Azure API Management
- Získejte asistenci Copilotu při vytváření, vysvětlování a řešení problémů se zásadami.