Antywzór: nieprawidłowy dostęp do wielowartościowych nagłówków HTTP w serwerze proxy interfejsu API

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Nagłówki HTTP to pary nazwy i wartości, które umożliwiają aplikacjom klienckim i usługom backendu do przekazywania dodatkowych informacji o żądaniach i odpowiedziach. Oto kilka prostych przykładów:

  • Nagłówek żądania autoryzacji przekazuje dane logowania użytkownika na serwer:
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • Nagłówek Content-Type wskazuje typ wysyłanych treści żądania/odpowiedzi:
    Content-Type: application/json

Nagłówki HTTP mogą mieć jedną lub więcej wartości w zależności od parametru definicje pól nagłówka. Nagłówek z wieloma wartościami zawiera wartości rozdzielone przecinkami. Oto kilka przykładów nagłówków zawierających wiele wartości:

  • Cache-Control: no-cache, no-store, must-revalidate
  • Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
  • X-Forwarded-For: 10.125.5.30, 10.125.9.125
.

Apigee Edge umożliwia programistom dostęp do nagłówków za pomocą zmienne przepływu w dowolnej z zasad Edge lub przepływów warunkowych. Oto lista zmiennych, których możesz użyć aby uzyskać dostęp do określonego nagłówka żądania lub odpowiedzi w Edge:

Zmienne przepływu:

  • message.header.header-name
  • request.header.header-name
  • response.header.header-name
  • message.header.header-name.N
  • request.header.header-name.N
  • response.header.header-name.N

Obiekty JavaScript:

  • context.proxyRequest.headers.header-name
  • context.targetRequest.headers.header-name
  • context.proxyResponse.headers.header-name
  • context.targetResponse.headers.header-name

Oto przykładowa zasada AssignMessage, która pokazuje, jak odczytywać wartość nagłówka żądania i zapisywać ją w zmiennej:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <AssignVariable>
    <Name>reqUserAgent</Name>
    <Ref>request.header.User-Agent</Ref>
  </AssignVariable>
</AssignMessage>

Antywzór

Uzyskiwanie dostępu do wartości nagłówków HTTP w zasadach Edge w sposób zwracający tylko pierwszą wartość jest nieprawidłowy i może powodować problemy, jeśli określone nagłówki HTTP mają więcej niż jedną wartość.

Poniższe sekcje zawierają przykłady dostępu do nagłówka.

Przykład 1: odczytywanie wielowartościowego nagłówka Accept za pomocą kodu JavaScript

Weź pod uwagę, że nagłówek Accept ma wiele wartości, jak pokazano poniżej:

Accept: text/html, application/xhtml+xml, application/xml

Oto kod JavaScript, który odczytuje wartość z nagłówka Accept:

// Read the values from Accept header
var acceptHeaderValues = context.getVariable("request.header.Accept");

Powyższy kod JavaScript zwraca tylko pierwszą wartość z nagłówka Accept, na przykład text/html.

Przykład 2. Odczytywanie wielowartościowego nagłówka Access-Control-Allow-Headers w zasadzie AssignMessage lub RaiseFault

Weź pod uwagę, że nagłówek Access-Control-Allow-Headers ma wiele wartości, jak pokazano poniżej:

Access-Control-Allow-Headers: content-type, authorization

Oto fragment kodu z nagłówka Access-Control-Allow-Headers, który określa zasadę AssignMessage lub RaiseFault:

<Set>
  <Headers>
    <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
  </Headers>
</Set>

Powyższy kod ustawia nagłówek Access-Control-Allow-Headers tylko z pierwszą wartością z parametru nagłówek żądania Access-Control-Allow-Headers, w tym przykładzie: content-type.

Wpływ

  1. W obu powyższych przykładach można zauważyć, że zwracana jest tylko pierwsza wartość z nagłówków wielowartościowych. Jeśli te wartości są później używane przez inną zasadę w procesie interfejsu API serwera proxy lub przez usługę backendu do realizacji funkcji lub logiki, może to prowadzić do nieoczekiwanych rezultatów.
  2. Po uzyskaniu dostępu do wartości nagłówków żądania i przekazaniu ich do serwera docelowego żądania do interfejsu API mogą być nieprawidłowo przetwarzane przez backend i dlatego mogą podawać nieprawidłowe wyniki.
  3. Jeśli aplikacja kliencka zależy od określonych wartości nagłówka w odpowiedzi Edge, może również zostać nieprawidłowo przetworzony i wyświetlić nieprawidłowe wyniki.

Sprawdzona metoda

  1. Użyj odpowiednich wbudowanych zmiennych procesu: request.header.header_name.values.count, request.header.header_name.N, response.header.header_name.values.count response.header.header_name.N

    Następnie powtarzaj czynności, aby pobrać wszystkie wartości z określonego nagłówka w zasadach dotyczących wywołań JavaScriptu lub Javy.

    Przykład: przykładowy kod JavaScript do odczytu nagłówka z wieloma wartościami

    for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++)
    {
      print(context.getVariable('request.header.Accept.' + i));
    }
    

    Na przykład application/xml;q=0.9, */*;q=0.8 pojawi się jako jedna wartość z powyższym kodem.

    Jeśli musisz podzielić wartości nagłówków średnikami jako separatorami, użyj string.split(";") aby podzielić je na wartości.

  2. Użyj funkcji substring() na zmiennej przepływu request.header.header_name.values w zasadzie RaiseFault lub AssignMessage w celu odczytania wszystkich wartości określonego nagłówka.

    Przykład: przykładowa zasada RaiseFault lub AssignMessage do odczytu nagłówka z wieloma wartościami

    <Set>
      <Headers>
       <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header>
      </Headers>
    </Set>
    

Więcej informacji