Weryfikowanie zawartości

DOTYCZY: Wszystkie warstwy usługi API Management

Zasady validate-content weryfikują rozmiar lub zawartość treści żądania lub odpowiedzi względem co najmniej jednego obsługiwanego schematu.

Poniższa tabela przedstawia formaty schematów oraz typy zawartości żądań i odpowiedzi obsługiwane przez zasady. Wartości typu zawartości są niewrażliwe na wielkość liter.

Format Typy zawartości
JSON Przykłady: application/json
application/hal+json
XML Przykład: application/xml
Simple Object Access Protocol Dozwolone wartości: application/soap+xml dla interfejsów API protokołu SOAP 1.2
text/xml dla interfejsów API protokołu SOAP 1.1

Uwaga

Maksymalny rozmiar schematu interfejsu API, który może być używany przez te zasady sprawdzania poprawności, wynosi 4 MB. Jeśli schemat przekroczy ten limit, zasady walidacji będą zwracać błędy w czasie wykonywania. Aby go zwiększyć, skontaktuj się z pomocą techniczną.

Jaka zawartość jest weryfikowana

Zasady weryfikują następującą zawartość w żądaniu lub odpowiedzi względem schematu:

  • Obecność wszystkich wymaganych właściwości.
  • Obecność lub brak dodatkowych właściwości, jeśli schemat ma additionalProperties ustawiony pole. Może zostać zastąpiony atrybutem allow-additional-properties .
  • Typy wszystkich właściwości. Na przykład, jeśli schemat określa właściwość jako liczbę całkowitą, żądanie (lub odpowiedź) musi zawierać liczbę całkowitą, a nie inny typ, taki jak ciąg.
  • Format właściwości, jeśli określono w schemacie — na przykład wyrażenie regularne (jeśli pattern określono słowo kluczowe), minimum dla liczb całkowitych itd.

Napiwek

Przykłady ograniczeń wzorca regularnego, które mogą być używane w schematach, zobacz OWASP Validation Regex Repository (Repozytorium regex weryfikacji OWASP).

Uwaga

Ustaw elementy zasad i elementy podrzędne w kolejności podanej w instrukcji zasad. Aby ułatwić konfigurowanie tych zasad, portal udostępnia edytor oparty na formularzach z przewodnikiem. Dowiedz się więcej na temat ustawiania lub edytowania zasad usługi API Management.

Instrukcja zasad

<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" />
</validate-content>

Atrybuty

Atrybut opis Wymagani Wartość domyślna
nieokreślone działanie typu zawartości Akcja do wykonania dla żądań lub odpowiedzi z typem zawartości, który nie jest określony w schemacie interfejsu API. Wyrażenia zasad są dozwolone. Tak Nie dotyczy
maksymalny rozmiar Maksymalna długość treści żądania lub odpowiedzi w bajtach zaznaczona względem nagłówka Content-Length . Jeśli treść żądania lub treść odpowiedzi jest skompresowana, ta wartość jest długością dekompresowaną. Maksymalna dozwolona wartość: 102 400 bajtów (100 KB). (Skontaktuj się z pomocą techniczną , jeśli musisz zwiększyć ten limit). Wyrażenia zasad są dozwolone. Tak Nie dotyczy
size-exceeded-action Akcja do wykonania dla żądań lub odpowiedzi, których treść przekracza rozmiar określony w .max-size Wyrażenia zasad są dozwolone. Tak Nie dotyczy
errors-variable-name Nazwa zmiennej w pliku , context.Variables aby rejestrować błędy walidacji. Wyrażenia zasad nie są dozwolone. Nie. Nie dotyczy

Elementy

Nazwa/nazwisko opis Wymagania
content-type-map Dodaj ten element, aby zamapować typ zawartości przychodzącego żądania lub odpowiedzi na inny typ zawartości używany do wyzwalania walidacji. Nie.
content Dodaj co najmniej jeden z tych elementów, aby zweryfikować typ zawartości w żądaniu lub odpowiedzi albo zamapowany typ zawartości i wykonać określoną akcję. Nie.

atrybuty mapy typu zawartości

Atrybut opis Wymagani Wartość domyślna
any-content-type-value Typ zawartości używany do sprawdzania poprawności treści żądania lub odpowiedzi, niezależnie od typu zawartości przychodzącej. Wyrażenia zasad nie są dozwolone. Nie. Nie dotyczy
missing-content-type-value Typ zawartości używany do sprawdzania poprawności treści żądania lub odpowiedzi, gdy brakuje przychodzącego typu zawartości lub jest on pusty. Wyrażenia zasad nie są dozwolone. Nie. Nie dotyczy

content-type-map-elements

Nazwa/nazwisko opis Wymagania
type Dodaj co najmniej jeden z tych elementów, aby zamapować przychodzący typ zawartości na typ zawartości używany do sprawdzania poprawności treści żądania lub odpowiedzi. Służy from do określania znanego typu zawartości przychodzącej lub użycia when z wyrażeniem zasad w celu określenia dowolnego przychodzącego typu zawartości zgodnego z warunkiem. Zastępuje mapowanie w any-content-type-value elementy i missing-content-type-value, jeśli określono. Nie.

atrybuty zawartości

Atrybut opis Wymagani Wartość domyślna
type Typ zawartości do wykonania weryfikacji treści dla, sprawdzany względem nagłówka typu zawartości lub wartości zamapowanej w content-type-mapping, jeśli określono. Jeśli jest pusty, ma zastosowanie do każdego typu zawartości określonego w schemacie interfejsu API.

Aby zweryfikować żądania protokołu SOAP i odpowiedzi (validate-as atrybut ustawiony na "soap"), dla application/soap+xmltype interfejsów API protokołu SOAP 1.2 lub text/xml interfejsów API protokołu SOAP 1.1.
Nie. Nie dotyczy
validate-as Aparat sprawdzania poprawności do sprawdzania poprawności treści żądania lub odpowiedzi z pasującym typeelementem . Obsługiwane wartości: "json", "xml", "soap".

Po określeniu "soap" kod XML z żądania lub odpowiedzi jest wyodrębniany z koperty protokołu SOAP i weryfikowany względem schematu XML.
Tak Nie dotyczy
identyfikator schematu Nazwa istniejącego schematu, który został dodany do wystąpienia usługi API Management na potrzeby weryfikacji zawartości. Jeśli nie zostanie określony, zostanie użyty domyślny schemat z definicji interfejsu API. Nie. Nie dotyczy
schema-ref W przypadku schematu JSON określonego w schema-idpliku opcjonalne odwołanie do prawidłowej lokalnej ścieżki odwołania w dokumencie JSON. Przykład: #/components/schemas/address. Atrybut powinien zwrócić obiekt JSON, który usługa API Management obsługuje jako prawidłowy schemat JSON.

W przypadku schematu schema-ref XML nie jest obsługiwany, a każdy element schematu najwyższego poziomu może być używany jako katalog główny ładunku żądania XML lub odpowiedzi. Sprawdzanie poprawności sprawdza, czy wszystkie elementy rozpoczynające się od żądania XML lub katalogu głównego ładunku odpowiedzi są zgodne z podanym schematem XML.
Nie. Nie dotyczy
allow-additional-properties Wartość logiczna. W przypadku schematu JSON określa, czy zaimplementować zastąpienie additionalProperties środowiska uruchomieniowego wartości skonfigurowanej w schemacie:
- true: zezwalaj na dodatkowe właściwości w treści żądania lub odpowiedzi, nawet jeśli pole schematu additionalProperties JSON jest skonfigurowane, aby nie zezwalać na dodatkowe właściwości.
- false: nie zezwalaj na dodatkowe właściwości w treści żądania lub odpowiedzi, nawet jeśli pole schematu additionalProperties JSON jest skonfigurowane tak, aby zezwalać na dodatkowe właściwości.

Jeśli atrybut nie zostanie określony, zasady weryfikują dodatkowe właściwości zgodnie z konfiguracją additionalProperties pola w schemacie.
Nie. Nie dotyczy

Akcje

Zasady sprawdzania poprawności zawartości obejmują co najmniej jeden atrybut określający akcję, która jest wykonywana przez usługę API Management podczas weryfikowania jednostki w żądaniu interfejsu API lub odpowiedzi względem schematu interfejsu API.

  • Można określić akcję dla elementów reprezentowanych w schemacie interfejsu API i, w zależności od zasad, dla elementów, które nie są reprezentowane w schemacie interfejsu API.

  • Akcja określona w elemecie podrzędnym zasad zastępuje akcję określoną dla jej elementu nadrzędnego.

Dostępne akcje:

Akcja opis
ignoruj Pomiń walidację.
Zapobiec Blokuj przetwarzanie żądania lub odpowiedzi, rejestruj pełny błąd weryfikacji i zwraca błąd. Przetwarzanie jest przerywane po wykryciu pierwszego zestawu błędów.
detect Błędy walidacji dziennika bez przerywania przetwarzania żądań lub odpowiedzi.

Użycie

  • Sekcje zasad: ruch przychodzący, ruch wychodzący, on-error
  • Zakresy zasad: globalny, obszar roboczy, produkt, interfejs API, operacja
  • Bramy: klasyczne, v2, zużycie, self-hosted

Dzienniki

Szczegółowe informacje o błędach walidacji podczas wykonywania zasad są rejestrowane w zmiennej context.Variables określonej w atrybucie errors-variable-name w elemecie głównym zasad. Po skonfigurowaniu prevent w akcji błąd walidacji blokuje dalsze przetwarzanie żądań lub odpowiedzi, a także jest propagowany do context.LastError właściwości .

Aby zbadać błędy, użyj zasad śledzenia, aby rejestrować błędy ze zmiennych kontekstowych do aplikacji Szczegółowe informacje.

Implikacje dotyczące wydajności

Dodanie zasad weryfikacji może mieć wpływ na przepływność interfejsu API. Obowiązują następujące ogólne zasady:

  • Im większy rozmiar schematu interfejsu API, tym niższa będzie przepływność.
  • Im większy ładunek w żądaniu lub odpowiedzi, tym niższa będzie przepływność.
  • Rozmiar schematu interfejsu API ma większy wpływ na wydajność niż rozmiar ładunku.
  • Walidacja względem schematu interfejsu API o rozmiarze kilku megabajtów może spowodować przekroczenie limitu czasu żądania lub odpowiedzi w niektórych warunkach. Efekt jest bardziej widoczny w warstwach Zużycie i Deweloper usługi.

Zalecamy przeprowadzenie testów obciążeniowych z oczekiwanymi obciążeniami produkcyjnymi, aby ocenić wpływ zasad walidacji na przepływność interfejsu API.

Schematy sprawdzania poprawności zawartości

Domyślnie walidacja zawartości żądania lub odpowiedzi używa schematów JSON lub XML z definicji interfejsu API. Te schematy można określić ręcznie lub wygenerować automatycznie podczas importowania interfejsu API ze specyfikacji OpenAPI lub WSDL do usługi API Management.

validate-content Za pomocą zasad możesz opcjonalnie zweryfikować co najmniej jeden schemat JSON lub XML, który został dodany do wystąpienia usługi API Management i który nie jest częścią definicji interfejsu API. Schemat dodany do usługi API Management można użyć ponownie w wielu interfejsach API.

Aby dodać schemat do wystąpienia usługi API Management przy użyciu witryny Azure Portal:

  1. W portalu przejdź do wystąpienia usługi API Management.

  2. W sekcji Interfejsy API menu po lewej stronie wybierz pozycję Schematy>+ Dodaj.

  3. W oknie Tworzenie schematu wykonaj następujące czynności:

    1. Wprowadź nazwę (identyfikator) dla schematu.
    2. W polu Typ schematu wybierz pozycję JSON lub XML.
    3. Wprowadź opis.
    4. W metodzie Create wykonaj jedną z następujących czynności:
      • Wybierz pozycję Utwórz nową i wprowadź lub wklej schemat.
      • Wybierz pozycję Importuj z pliku lub Importuj z adresu URL i wprowadź lokalizację schematu.

        Uwaga

        Aby zaimportować schemat z adresu URL, schemat musi być dostępny za pośrednictwem Internetu z przeglądarki.

    5. Wybierz pozycję Zapisz.

    Tworzenie schematu

Usługa API Management dodaje zasób schematu w względnym identyfikatorze URI /schemas/<schemaId>, a schemat jest wyświetlany na liście na stronie Schematy . Wybierz schemat, aby wyświetlić jego właściwości lub edytować w edytorze schematów.

Uwaga

Schemat może odwoływać się krzyżowo do innego schematu dodanego do wystąpienia usługi API Management. Na przykład dołącz schemat XML dodany do usługi API Management przy użyciu elementu podobnego do:

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

Napiwek

Narzędzia typu open source umożliwiające rozpoznawanie odwołań schematów WSDL i XSD oraz schematów generowanych wsadowo do usługi API Management są dostępne w usłudze GitHub.

Przykłady

Walidacja schematu JSON

W poniższym przykładzie usługa API Management interpretuje żądania z pustym nagłówkiem typu zawartości lub żądaniami z nagłówkiem application/hal+json typu zawartości jako żądaniami o typie application/jsonzawartości . Następnie usługa API Management przeprowadza walidację w trybie wykrywania względem schematu zdefiniowanego application/json dla typu zawartości w definicji interfejsu API. Komunikaty z ładunkami większymi niż 100 KB są blokowane. Żądania zawierające dodatkowe właściwości są blokowane, nawet jeśli pole schematu additionalProperties jest skonfigurowane do zezwalania na dodatkowe właściwości.

<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>

Weryfikacja schematu protokołu SOAP

W poniższym przykładzie usługa API Management interpretuje dowolne żądanie jako żądanie z typem application/soap+xml zawartości (typem zawartości używanym przez interfejsy API protokołu SOAP 1.2), niezależnie od typu zawartości przychodzącej. Żądanie może zostać dostarczone z pustym nagłówkiem typu zawartości, nagłówkiem text/xml typu zawartości (używanym przez interfejsy API PROTOKOŁU SOAP 1.1) lub innym nagłówkiem typu zawartości. Następnie usługa API Management wyodrębnia ładunek XML z koperty protokołu SOAP i przeprowadza walidację w trybie zapobiegania schematowi o nazwie "myschema". Komunikaty z ładunkami większymi niż 100 KB są blokowane.

<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>

Błędy walidacji

Usługa API Management generuje błędy walidacji zawartości w następującym formacie:

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

W poniższej tabeli wymieniono wszystkie możliwe błędy zasad walidacji.

  • Szczegóły: Może służyć do badania błędów. Nie ma być udostępniane publicznie.
  • Odpowiedź publiczna: błąd zwrócony do klienta. Nie wycieka szczegółów implementacji.

Gdy zasady weryfikacji określają prevent akcję i generują błąd, odpowiedź z usługi API Management zawiera kod stanu HTTP: 400, gdy zasady są stosowane w sekcji przychodzącej i 502, gdy zasady są stosowane w sekcji ruchu wychodzącego.

Nazwa/nazwisko Type Reguła walidacji Szczegóły Odpowiedź publiczna Akcja
validate-content
RequestBody RozmiarLimit Treść żądania ma długość {size} bajtów i przekracza skonfigurowany limit {maxSize} bajtów. Treść żądania ma długość {size} bajtów i przekracza limit {maxSize} bajtów. wykrywanie/zapobieganie
Treść odpowiedzi RozmiarLimit Treść odpowiedzi ma długość {size} bajtów i przekracza skonfigurowany limit {maxSize} bajtów. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{messageContentType} RequestBody Nieokreślony Nieokreślony typ zawartości {messageContentType} jest niedozwolony. Nieokreślony typ zawartości {messageContentType} jest niedozwolony. wykrywanie/zapobieganie
{messageContentType} Treść odpowiedzi Nieokreślony Nieokreślony typ zawartości {messageContentType} jest niedozwolony. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
ApiSchema Schemat interfejsu API nie istnieje lub nie można go rozpoznać. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
ApiSchema Schemat interfejsu API nie określa definicji. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{messageContentType} RequestBody /ResponseBody MissingDefinition (Brak definicji) Schemat interfejsu API nie zawiera definicji {definitionName}, która jest skojarzona z typem zawartości {messageContentType}. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{messageContentType} RequestBody IncorrectMessage Treść żądania nie jest zgodna z definicją {definitionName}, która jest skojarzona z typem zawartości {messageContentType}.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
Treść żądania nie jest zgodna z definicją {definitionName}, która jest skojarzona z typem zawartości {messageContentType}.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
wykrywanie/zapobieganie
{messageContentType} Treść odpowiedzi IncorrectMessage Treść odpowiedzi nie jest zgodna z definicją {definitionName}, która jest skojarzona z typem zawartości {messageContentType}.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
RequestBody Validationexception Nie można zweryfikować treści żądania dla typu zawartości {messageContentType}.

{szczegóły wyjątku}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
Treść odpowiedzi Validationexception Nie można zweryfikować treści odpowiedzi dla typu zawartości {messageContentType}.

{szczegóły wyjątku}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
validate-parameters/validate-headers
{paramName} / {headerName} QueryParameter / PathParameter / RequestHeader Nieokreślony Nieokreślony parametr ścieżki / parametr zapytania / nagłówek} {paramName} jest niedozwolony. Nieokreślony parametr ścieżki / parametr zapytania / nagłówek} {paramName} jest niedozwolony. wykrywanie/zapobieganie
{headerName} ResponseHeader Nieokreślony Nieokreślony nagłówek {headerName} jest niedozwolony. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
ApiSchema Schemat interfejsu API nie istnieje lub nie można go rozpoznać. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
ApiSchema Schemat interfejsu API nie określa definicji. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{paramName} QueryParameter / PathParameter / RequestHeader / ResponseHeader MissingDefinition (Brak definicji) Schemat interfejsu API nie zawiera definicji {definitionName}, która jest skojarzona z parametrem zapytania / parametrem ścieżki / nagłówkiem} {paramName}. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage Żądanie nie może zawierać wielu wartości dla parametru {query / parametru ścieżki / nagłówka} {paramName}. Żądanie nie może zawierać wielu wartości dla parametru {query / parametru ścieżki / nagłówka} {paramName}. wykrywanie/zapobieganie
{headerName} ResponseHeader IncorrectMessage Odpowiedź nie może zawierać wielu wartości nagłówka {headerName}. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage Wartość parametru zapytania / parametru ścieżki / nagłówka} {paramName} nie jest zgodna z definicją.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
Wartość parametru zapytania / parametru ścieżki / nagłówka} {paramName} nie jest zgodna z definicją.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
wykrywanie/zapobieganie
{headerName} ResponseHeader IncorrectMessage Wartość nagłówka {headerName} nie jest zgodna z definicją.

{valError.Message} Wiersz: {valError.LineNumber}, pozycja: {valError.LinePosition}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{paramName} QueryParameter / PathParameter / RequestHeader IncorrectMessage Nie można przeanalizować wartości {parametru kwerendy/parametru ścieżki/nagłówka} {paramName} zgodnie z definicją.

{np. Wiadomość}
Nie można przeanalizować wartości {parametru kwerendy/parametru ścieżki/nagłówka} {paramName} zgodnie z definicją.

{np. Wiadomość}
wykrywanie/zapobieganie
{headerName} ResponseHeader IncorrectMessage Nie można przeanalizować wartości nagłówka {headerName} zgodnie z definicją. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{paramName} QueryParameter / PathParameter / RequestHeader Validationerror {Parametr zapytania / Parametr ścieżki / Nagłówek} Nie można zweryfikować parametru {paramName}.

{szczegóły wyjątku}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
{headerName} ResponseHeader Validationerror Nie można zweryfikować nagłówka {headerName}.

{szczegóły wyjątku}
Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie
validate-status-code
{status-code} StatusCode Nieokreślony Kod stanu odpowiedzi {kod stanu} jest niedozwolony. Nie można przetworzyć żądania z powodu błędu wewnętrznego. Skontaktuj się z właścicielem interfejsu API. wykrywanie/zapobieganie

W poniższej tabeli wymieniono wszystkie możliwe wartości Przyczyna błędu weryfikacji wraz z możliwymi wartościami komunikatu:

Przyczyna Wiadomość
Nieprawidłowe żądanie {Details} dla zmiennej kontekstowej { odpowiedź publiczna} dla klienta
Niedozwolona odpowiedź {Details} dla zmiennej kontekstowej { odpowiedź publiczna} dla klienta

Aby uzyskać więcej informacji na temat pracy z zasadami, zobacz: