Chúng dường như là các cài đặt bên trong cho công cụ PCRE để giới hạn dung lượng bộ nhớ / thời gian tối đa dành cho việc cố gắng khớp một số văn bản với một mẫu. Các pcreapi
manpage không ít để giải thích nó trong điều kiện của giáo dân:
Trường match_limit cung cấp phương tiện ngăn PCRE sử dụng một lượng lớn tài nguyên khi chạy các mẫu không khớp, nhưng có số lượng khả năng rất lớn trong các cây tìm kiếm của chúng. Ví dụ kinh điển là việc sử dụng lặp lại không giới hạn lồng nhau.
Trong nội bộ, PCRE sử dụng một hàm gọi là match () mà nó gọi liên tục (đôi khi là đệ quy). Giới hạn được đặt bởi match_limit được áp dụng cho số lần hàm này được gọi trong một trận đấu, điều này có tác dụng giới hạn số lần quay lại có thể diễn ra. Đối với các mẫu không được neo, số đếm khởi động lại từ 0 cho mỗi vị trí trong chuỗi chủ đề.
Giá trị mặc định cho giới hạn có thể được đặt khi PCRE được xây dựng; mặc định là 10 triệu, xử lý tất cả các trường hợp cực đoan nhất. Bạn có thể ghi đè mặc định bằng cách thay thế pcre_exec () bằng khối pcre_extra trong đó match_limit được đặt và PCRE_EXTRA_MATCH_LIMIT được đặt trong trường cờ. Nếu vượt quá giới hạn, pcre_exec () trả về PCRE_ERROR_MATCHLIMIT.
Trường match_limit_recursion tương tự như match_limit, nhưng thay vì giới hạn tổng số lần khớp () được gọi, nó sẽ giới hạn độ sâu của đệ quy. Độ sâu đệ quy là một số nhỏ hơn tổng số cuộc gọi, vì không phải tất cả các cuộc gọi để khớp () đều được đệ quy. Giới hạn này chỉ được sử dụng nếu nó được đặt nhỏ hơn match_limit.
Vì thư viện PCRE mặc định tích hợp là 10000000, tôi đoán rằng cài đặt thấp hơn được đề xuất cho mod_securance để ngăn các yêu cầu được giữ trong một thời gian dài.