Phản mẫu: Truy cập không chính xác các tiêu đề HTTP nhiều giá trị trong Proxy API

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Tiêu đề HTTP là cặp giá trị tên cho phép ứng dụng khách và dịch vụ phụ trợ để truyền thông tin bổ sung tương ứng về yêu cầu và phản hồi. Một số ví dụ đơn giản là:

  • Tiêu đề của yêu cầu uỷ quyền sẽ chuyển thông tin đăng nhập của người dùng đến máy chủ:
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • Tiêu đề Content-Type cho biết loại nội dung yêu cầu/phản hồi đang được gửi:
    Content-Type: application/json

Tiêu đề HTTP có thể có một hoặc nhiều giá trị, tuỳ thuộc vào định nghĩa trường tiêu đề. Một tiêu đề có nhiều giá trị sẽ có các giá trị được phân tách bằng dấu phẩy. Dưới đây là một vài ví dụ về tiêu đề chứa nhiều giá trị:

  • 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 giúp nhà phát triển dễ dàng truy cập vào tiêu đề bằng biến luồng trong bất kỳ chính sách Edge hoặc luồng có điều kiện nào. Sau đây là danh sách các biến có thể dùng để truy cập vào tiêu đề phản hồi hoặc yêu cầu cụ thể trong Edge:

Biến luồng:

  • 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

Đối tượng JavaScript:

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

Dưới đây là ví dụ về chính sách AttributionMessage cho biết cách đọc giá trị của tiêu đề yêu cầu và lưu trữ giá trị đó vào một biến:

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

Phản mẫu

Truy cập vào giá trị của tiêu đề HTTP trong các chính sách của Edge theo cách chỉ trả về giá trị đầu tiên không chính xác và có thể gây ra sự cố nếu(các) Tiêu đề HTTP cụ thể có nhiều giá trị.

Các phần sau đây trình bày các ví dụ về quyền truy cập vào tiêu đề.

Ví dụ 1: Đọc tiêu đề Chấp nhận có nhiều giá trị bằng mã JavaScript

Hãy cân nhắc rằng tiêu đề Accept có nhiều giá trị như dưới đây:

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

Dưới đây là mã JavaScript đọc giá trị từ tiêu đề Accept:

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

Mã JavaScript ở trên chỉ trả về giá trị đầu tiên từ tiêu đề Accept, chẳng hạn như text/html.

Ví dụ 2: Đọc tiêu đề Access-Control-Allow-Headers có nhiều giá trị trong chính sách AllowedMessage hoặc RaiseFault

Hãy cân nhắc rằng tiêu đề Access-Control-Allow-Headers có nhiều giá trị như dưới đây:

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

Dưới đây là một phần của mã trong việc đặt tiêu đề Access-Control-Allow-Headers trong chính sách OnlyMessage hoặc RaiseFault:

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

Mã ở trên đặt Tiêu đề Access-Control-Allow-Headers chỉ với giá trị đầu tiên từ tiêu đề của yêu cầu Access-Control-Allow-Headers, trong ví dụ này là content-type.

Tác động

  1. Trong cả hai ví dụ ở trên, lưu ý rằng chỉ giá trị đầu tiên từ các tiêu đề có nhiều giá trị mới được trả về. Nếu sau đó các giá trị này được một chính sách khác sử dụng trong luồng Proxy API hoặc dịch vụ phụ trợ thực hiện chức năng hoặc logic nào đó, thì điều đó có thể dẫn đến kết quả hoặc kết quả không mong muốn.
  2. Khi các giá trị tiêu đề của yêu cầu được truy cập và truyền vào máy chủ đích, các yêu cầu API có thể được chương trình phụ trợ xử lý không chính xác nên có thể trả về kết quả không chính xác.
  3. Nếu ứng dụng khách phụ thuộc vào các giá trị tiêu đề cụ thể từ phản hồi của Edge, thì ứng dụng cũng có thể xử lý không chính xác và đưa ra kết quả không chính xác.

Phương pháp hay nhất

  1. Sử dụng các biến luồng tích hợp sẵn phù hợp: request.header.header_name.values.count, request.header.header_name.N, response.header.header_name.values.count response.header.header_name.N.

    Sau đó, lặp lại để tìm nạp tất cả các giá trị từ một tiêu đề cụ thể trong chính sách chú thích JavaScript hoặc Java.

    Ví dụ: Mã JavaScript mẫu để đọc tiêu đề nhiều giá trị

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

    Ví dụ: application/xml;q=0.9, */*;q=0.8 sẽ xuất hiện dưới dạng một giá trị với mã ở trên.

    Nếu cần phân tách các giá trị tiêu đề bằng dấu chấm phẩy làm dấu phân tách, hãy dùng string.split(";") để tách chúng thành các giá trị.

  2. Dùng hàm substring() trên biến luồng request.header.header_name.values trong chính sách RaiseFault hoặc AttributionMessage để đọc tất cả các giá trị của một tiêu đề cụ thể.

    Ví dụ: Lấy mẫu chính sách RaiseFault hoặc hoặc AssignmentsMessage để đọc một tiêu đề nhiều giá trị

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

Tài liệu đọc thêm