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 chính thức chính thức Protection xác định các biểu thức chính quy được đánh giá trong thời gian chạy dựa trên các tham số đầu vào hoặc biến luồng. Bạn thường dùng chính sách này để ngăn chặn các mối đe doạ về 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.

Bạn có thể xác định biểu thức chính quy cho đường dẫn yêu cầu, tham số truy vấn, tham số biểu mẫu, tiêu đề, phần tử XML (trong tải trọng XML được xác định bằng XPath), thuộc tính đối tượng JSON (trong tải trọng JSON đượ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 các cuộc tấn công chèn SQL:

<!-- /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 bộ định lượng mặc định (*, +?) về bản chất rất tham lam: 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, chúng sẽ dần lùi lại để cố gắng khớp với mẫu. Nếu chuỗi kết quả khớp với mẫu rất ngắn, thì việc sử dụng bộ định lượng tham số có thể mất nhiều thời gian hơn mức cần thiết. Điều này đặc biệt đúng nếu tải trọng lớn (hàng chục hoặc hàng trăm KB).

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

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

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

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

Cho sẵn 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 lam sẽ không mang lại hiệu quả trong trường hợp này. Cần 141 bước để khớp mẫu .*Exception in thread.*. Thay vào đó, nếu bạn sử dụng mẫu .*?Exception in thread.* (sử dụng bộ định lượng miễn phí), kết quả sẽ chỉ là 55 bước.

Mức độ tác động

Việc sử dụng các bộ định lượng tham lam như ký tự đại diện (*) kèm theo chính sáchRegularExpressionProtection có thể dẫn đến:

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

Phương pháp hay nhất

  • Tránh sử dụng các bộ định lượng quá mức như .* trong biểu thức chính quy bằng chính sách chính và giá trị bảo vệ. Thay vào đó, hãy sử dụng các bộ định lượng miễn phí như .*? hoặc các bộ định lượng sở hữu như .*+ (ít gặp hơn) nếu có thể.

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