Chống lỗi: Sử dụng bộ định lượng tham lam trong chính sách RegularThể hiện bảo vệ

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

Chính sách RegularExpressionProtection xác định biểu thức chính quy được đánh giá ở thời gian chạy trên các tham số đầu vào hoặc biến luồng. Bạn thường sử dụng chính sách này để ngăn chặn các mối đe doạ nội dung như chèn SQL hoặc JavaScript hoặc để kiểm tra các tham số yêu cầu không đúng định dạng như địa chỉ email hoặc URL.

Biểu thức chính quy có thể được xác định cho đường dẫn yêu cầu, tham số truy vấn, tham số biểu mẫu, các tiêu đề, phần tử XML (trong tải trọng XML được xác định bằng Wi-Fi), thuộc tính đối tượng JSON (trong tệp JSON tải trọng được xác định bằng JSONPath).

Ví dụ sau đây về chính sách RegularExpressionProtection bảo vệ phần phụ trợ khỏi SQL tấn công tiêm mã:

<!-- /antipatterns/examples/greedy-1.xml -->
<RegularExpressionProtection async="false" continueOnError="false" enabled="true"
  name="RegexProtection">
    <DisplayName>RegexProtection</DisplayName>
    <Properties/>
    <Source>request</Source>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <QueryParam name="query">
      <Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|
        (insert)|(shutdown)|(update)|(\bor\b))</Pattern>
    </QueryParam>
</RegularExpressionProtection>

Phản mẫu

Các số lượng mặc định (*, +?) rất tham chiếu trong tính chất: chúng bắt đầu khớp với chuỗi dài nhất có thể. Khi không tìm thấy kết quả trùng khớp, ngược lại dần để cố gắng khớp với mẫu. Nếu chuỗi kết quả khớp với mẫu là rất ngắn, thì việc sử dụng số lượng tham lam có thể mất nhiều thời gian hơn mức cần thiết. Điều này đặc biệt true nếu tải trọng lớn (tính bằng hàng chục hoặc hàng trăm KB).

Biểu thức ví dụ sau đây sử dụng nhiều thực thể của .*, tham số này toán tử:

<Pattern>.*Exception in thread.*</Pattern>

Trong ví dụ này, chính sáchRegularExpressionProtection trước tiên sẽ cố gắng khớp với thời gian dài nhất có thể trình tự – toàn bộ chuỗi. Nếu không tìm thấy kết quả trùng khớp thì chính sách sẽ áp dụng ngược lại dần dần. Nếu chuỗi khớp ở gần phần đầu hoặc phần giữa của tải trọng, thì hãy sử dụng bộ định lượng tham lam như .* có thể mất nhiều thời gian và khả năng xử lý hơn so với miễn cưỡng bộ hạn định như .*? hoặc số lượng tử sở hữu (ít phổ biến hơn) .*+.

Các số lượng chênh lệch (như X*?, X+?, X??) bắt đầu bằng cách thử để khớp với một ký tự từ đầu tải trọng và thêm dần các ký tự. Các số lượng sở hữu (như X?+, X*+, X++) hãy cố gắng khớp với cho toàn bộ tải trọng một lần.

Cho văn bản mẫu sau cho mẫu ở trên:

Hello this is a sample text with Exception in thread
with lot of text after the Exception text.

Việc sử dụng tham số .* sẽ không mang lại hiệu quả trong trường hợp này. Mẫu .*Exception in thread.* mất 141 bước để so khớp. Nếu bạn đã dùng hình mở khoá Thay vào đó, .*?Exception in thread.* (sử dụng bộ định lượng miễn trừ), kết quả sẽ chỉ 55 bước.

Tác động

Sử dụng số lượng tham lam như ký tự đại diện (*) với Chính sách RegularExpressionProtection có thể dẫn đến:

  • Độ trễ tổng thể tăng đối với các yêu cầu API đối với kích thước tải trọng vừa phải (tối đa 1 MB)
  • Mất nhiều thời gian hơn để hoàn tất việc thực thi chính sách RegularExpressionProtection
  • Các yêu cầu API có tải trọng lớn (>1MB) không thực hiện được kèm theo lỗi 504 Gateway Hết thời gian chờ nếu đã hết khoảng thời gian chờ xác định trước trên Bộ định tuyến cạnh
  • Mức sử dụng CPU cao trên Bộ xử lý tin nhắn do phải xử lý nhiều, ảnh hưởng đến các yêu cầu API khác

Phương pháp hay nhất

  • Tránh sử dụng các số lượng tham lam như .* trong biểu thức chính quy bằng Chính sách RegularExpressionProtection. Thay vào đó, hãy sử dụng các số lượng miễn trừ như .*? hoặc số lượng tử sở hữu như .*+ (ít phổ biến hơn) ở bất cứ đâu nhất có thể.

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