Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
Chính sách RegularExpressionProtection xác định các biểu thức chính quy được đánh giá tại thời gian chạy trên các tham số đầu vào hoặc biến luồng. Thông thường, bạn dùng chính sách này để bảo vệ khỏi các mối đe doạ về nội dung như SQL hoặc JavaScript injection, hoặc để kiểm tra các tham số yêu cầu có định dạng không đú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).
Chính sách RegularExpressionProtection sau đây 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>
Antipattern
Các bộ định lượng mặc định (*, + và ?) có bản chất là tham lam: chúng bắt đầu so 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 quay 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 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 đúng nếu tải trọng lớn (hàng chục hoặc hàng trăm KB).
Biểu thức ví dụ sau đây sử dụng nhiều phiên bản của .*, là các toán tử tham lam:
<Pattern>.*Exception in thread.*</Pattern>
Trong ví dụ này, chính sách RegularExpressionProtection trước tiên sẽ cố gắng so khớp chuỗi 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 quay lại. Nếu chuỗi khớp gần với phần đầu hoặc giữa của tải trọng, thì việc sử dụng một bộ định lượng tham lam như .* có thể mất nhiều thời gian và sức mạnh xử lý hơn so với các bộ định lượng miễn cưỡng như .*? hoặc (ít phổ biến hơn) bộ định lượng sở hữu như .*+.
Các lượng từ không tham lam (như X*?, X+?, X??) bắt đầu bằng cách cố gắng khớp một ký tự duy nhất từ đầu tải trọng và dần dần thêm các ký tự.
Bộ định lượng sở hữu (như X?+, X*+, X++) chỉ cố gắng so khớp toàn bộ tải trọng một lần.
Cho trước văn bản mẫu sau đây cho mẫu trên:
Hello this is a sample text with Exception in thread with lot of text after the Exception text.
Trong trường hợp này, việc sử dụng .* tham lam sẽ không hiệu quả. Mẫu .*Exception in thread.* cần 141 bước để khớp. Nếu bạn sử dụng mẫu .*?Exception in thread.* (sử dụng một lượng từ miễn cưỡng) thay vào đó, kết quả sẽ chỉ có 55 bước.
Tác động
Việc sử dụng các lượng từ 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 lên đối với các yêu cầu API có kích thước tải trọng vừa phải (lên đến 1 MB)
- Thời gian hoàn tất việc thực thi chính sách RegularExpressionProtection lâu hơn
- Các yêu cầu API có tải trọng lớn (> 1MB) không thành công kèm theo Lỗi 504 Hết thời gian chờ của cổng nếu khoảng thời gian chờ được xác định trước trôi qua trên Bộ định tuyến biên
- Mức sử dụng CPU cao trên Trình xử lý thông báo do lượng lớn dữ liệu cần xử lý, điều này có thể ảnh hưởng thêm đến các yêu cầu API khác
Phương pháp hay nhất
- Tránh sử dụng các lượng từ 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 lượng từ không tham lam như.*?hoặc các lượng từ sở hữu như.*+(ít phổ biến hơn) bất cứ khi nào có thể.