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ác cặp giá trị tên cho phép ứng dụng khách và dịch vụ phụ trợ truyền thêm thông tin tương ứng về yêu cầu và phản hồi. Sau đây là một số ví dụ đơn giản:

  • Tiêu đề của yêu cầu uỷ quyền chuyển thông tin xác thực 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 của trường tiêu đề. 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 các nhà phát triển dễ dàng truy cập vào tiêu đề bằng cách sử dụng các biến luồng trong bất kỳ chính sách hoặc quy trình có điều kiện nào của Edge. Sau đây là danh sách các biến có thể dùng để truy cập vào một 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à một mẫu chính sách ScheduleMessage cho thấy 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

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

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

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

Hãy lưu ý rằng tiêu đề Accept có nhiều giá trị như minh hoạ dưới đây:

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

Dưới đây là mã JavaScript đọc giá trị trong 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 một tiêu đề Access-Control-Allow-Headers có nhiều giá trị trong chính sách AssignmentsMessage hoặc RaiseFault

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

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

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

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

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

Mức độ tác động

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

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

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

    Ví dụ: Ví dụ: Chính sách RaiseFault hoặc AssignmentsMessage mẫu để đọc tiêu đề có 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