Tôi biết về từ chối dịch vụ thường xuyên (ReDoS). Có cách nào hợp lý để cho phép người dùng tạo các biểu thức tùy chỉnh trong khi đảm bảo rằng họ không gửi mẫu chậm theo cấp số nhân không?
Tôi biết về từ chối dịch vụ thường xuyên (ReDoS). Có cách nào hợp lý để cho phép người dùng tạo các biểu thức tùy chỉnh trong khi đảm bảo rằng họ không gửi mẫu chậm theo cấp số nhân không?
Câu trả lời:
Vấn đề với các biểu thức thông thường không phải là bản thân regex, mà là công cụ regex có tất cả các loại tính năng tiện lợi của thành phố như như quay lui. Do đó, sử dụng công cụ regex mà không có các tính năng này sẽ tránh được.
Các biểu thức chính quy, khái niệm khoa học máy tính luôn có thể được khớp trong thời gian tuyến tính sau khi chúng được biên dịch thành một máy trạng thái hữu hạn. Vì vậy, một công cụ regex dựa trên máy trạng thái không thể được sử dụng cho ReDoS. Tuy nhiên, các máy trạng thái cần thiết có thể trở nên khá lớn trong các ví dụ bệnh lý. Nhưng việc giới hạn bộ nhớ khả dụng có xu hướng dễ dàng hơn là giới hạn thời gian tính toán khả dụng.
Công cụ RE2 được phát triển đặc biệt để đối phó với các biểu thức không tin cậy và được thiết kế để thực hiện theo thời gian tuyến tính.
Một cách khác là tự lắp ráp các biểu thức chính từ một ký hiệu đơn giản hóa. Ví dụ: bạn có thể cho phép người dùng sử dụng các mẫu toàn cầu (như *.txt
). Sau đó, bạn có thể phân tích điều đó theo cách ngăn chặn quay lui, ví dụ bằng cách không cho phép lồng và chỉ sử dụng các bộ lượng hóa tham lam. Đối với nhiều trường hợp sử dụng, ký hiệu mẫu đơn giản là hoàn toàn đủ.
Phân tích một biểu thức chính quy để xem liệu nó sẽ chậm hay không, mà không có phân tích trở nên chậm , chính là cách giải quyết vấn đề tạm dừng. Nói cách khác, không thể tìm ra giải pháp chính xác và đầy đủ.
Bạn có thể, tất nhiên, tìm một giải pháp đó là chính xác và trong hoàn tất. Chẳng hạn, bạn có thể làm việc với một danh sách trắng các tính năng hạn chế an toàn để sử dụng (ví dụ: các lớp ký tự có, lặp lại không ...). Điều này sẽ cho phép bạn vượt qua rất nhiều chế độ không chính xác, từ chối tất cả các quy tắc quan trọng và (sai) từ chối một số điều không ổn, nhưng quá phức tạp để tự động chứng minh an toàn.
Là tác giả của trình phân tích lại cho dự án lazarus, tôi sẽ nói rằng không có cách nào để hiểu đối với bất kỳ biểu thức chính quy định nào mà tài nguyên mà nó sẽ tiêu thụ trên một văn bản nhất định.
Tôi không sử dụng cùng một nguồn tài nguyên (ít nhất là theo nghĩa lớn-O).
Vì vậy, cách tiếp cận tốt nhất - chạy trình phân tích lại trong luồng riêng biệt và tiêu diệt nó sau khi hết thời gian.
Ngoài các câu trả lời khác, một giải pháp cũng có thể là cuộn thư viện regex của riêng bạn, cho phép thiết bị đo hiệu suất trong khi thực hiện, và do đó cung cấp phương tiện để giết chết việc thực thi giữa chừng nếu một số tiêu chí được đáp ứng.
Tương tự, bạn có thể chạy regexes trên một luồng khác và giết các luồng nếu chúng mất quá nhiều thời gian.