Giới hạn PCRE là gì?


11

Trong ModSecurance có PCRE limits exceededlỗi.

Tôi biết tôi có thể khắc phục điều này bằng cách đặt các quy tắc như:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Nhưng, những quy tắc này thực sự đang làm gì? Giới hạn đệ quy PCRE được đặt thành 150.000 có nghĩa là gì? Những lỗ hổng bảo mật nào tôi cho phép thông qua bằng cách đặt những cái này quá cao? Không recursionlimitcó nghĩa là gì?

Tôi biết có tài liệu, nhưng tài liệu không thực sự cho tôi biết chuyện gì đang xảy ra, nó chỉ cho tôi biết cách làm việc với các chỉ thị.


Tôi đang chỉnh sửa bài đăng này để thay đổi thẻ "perl" thành "pcre". PCRE không phải là Perl, bất chấp những từ viết tắt nào bạn có thể tin được.
Andy Lester

Câu trả lời:


13

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.


modsecurance dường như có giá trị mặc định là 1500 , thấp hơn đáng kể so với 1M. Giá trị 150000 của OP sau đó sẽ tăng cài đặt, không giảm giá trị.
Paul Mougel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.