Từ chối ‐ của Conc Mối quan tâm dịch vụ
Mối quan tâm phổ biến nhất với regexes là sự từ chối ‐ của attack dịch vụ tấn công thông qua các mô hình bệnh lý đi theo cấp số nhân - hoặc thậm chí siêu cấp số mũ! - và vì vậy xuất hiện để mất mãi mãi để giải quyết. Chúng chỉ có thể hiển thị trên dữ liệu đầu vào cụ thể, nhưng người ta thường có thể tạo một dữ liệu trong đó điều này không quan trọng.
Những cái này sẽ phụ thuộc phần nào vào mức độ thông minh của trình biên dịch regex mà bạn đang sử dụng, bởi vì một số trong số này có thể được phát hiện trong thời gian biên dịch. Trình biên dịch Regex thực hiện đệ quy thường có bộ đếm đệ quy ‐ trong bộ đếm độ sâu để kiểm tra sự không tiến triển.
Bài viết xuất sắc năm 2007 của Russ Cox về Kết hợp biểu thức chính quy có thể đơn giản và nhanh chóng (nhưng chậm trong Java, Perl, PHP, Python, Ruby, ...) nói về những cách mà hầu hết các NFA hiện đại, mà tất cả dường như bắt nguồn từ mã của Henry Spencer , bị suy giảm hiệu suất nghiêm trọng, nhưng trong đó một NFA kiểu Thompson không có vấn đề như vậy.
Nếu bạn chỉ thừa nhận các mẫu có thể được giải quyết bằng các DFA, bạn có thể biên dịch chúng theo cách đó và chúng sẽ chạy nhanh hơn, có thể nhanh hơn nhiều. Tuy nhiên, cần có thời gian để làm điều này. Bài viết của Cox đề cập đến phương pháp này và các vấn đề liên quan. Tất cả bắt nguồn từ một giao dịch không gian thời gian cổ điển.
Với DFA, bạn dành nhiều thời gian hơn để xây dựng nó (và phân bổ nhiều trạng thái hơn), trong khi với NFA, bạn dành nhiều thời gian hơn để thực hiện nó, vì nó có thể là nhiều trạng thái cùng một lúc và quay lui có thể ăn bữa trưa của bạn - và CPU của bạn.
Từ chối ‐ của Giải pháp dịch vụ
Có lẽ cách hợp lý nhất để giải quyết những mô hình đang ở cuối cuộc đua với sức nóng cái chết của vũ trụ là bọc chúng bằng một bộ đếm thời gian có hiệu quả đặt thời gian tối đa cho phép thực hiện. Thông thường, điều này sẽ nhiều, ít hơn nhiều so với thời gian chờ mặc định mà hầu hết các máy chủ HTTP cung cấp.
Có nhiều cách khác nhau để thực hiện những điều này, từ đơn giản alarm(N)ở cấp độ C, đến một số try {}loại ngoại lệ loại báo động bắt, tất cả các cách để tạo ra một luồng mới được tạo đặc biệt với một ràng buộc thời gian được tích hợp ngay trong nó.
Mã chú thích
Trong các ngôn ngữ regex thừa nhận các chú thích mã, một số cơ chế cho phép hoặc không cho phép các chuỗi này khỏi chuỗi bạn sẽ biên dịch sẽ được cung cấp. Ngay cả khi các chú thích mã chỉ để mã bằng ngôn ngữ bạn đang sử dụng, bạn nên hạn chế chúng; họ không cần phải gọi mã bên ngoài, mặc dù nếu có thể, bạn đã gặp vấn đề lớn hơn nhiều.
Ví dụ, trong Perl, người ta không thể có các chú thích mã trong các biểu thức được tạo từ phép nội suy chuỗi (vì chúng sẽ được biên dịch trong thời gian chạy) trừ khi pragma có phạm vi từ vựng đặc biệt use re "eval";hoạt động trong phạm vi hiện tại.
Bằng cách đó, không ai có thể lẻn vào một chú thích mã để chạy các chương trình hệ thống như rm -rf *, chẳng hạn. Vì các chú thích mã rất nhạy cảm về bảo mật, Perl sẽ vô hiệu hóa chúng theo mặc định trên tất cả các chuỗi được nội suy và bạn phải tránh ra để kích hoạt lại chúng.
Người dùng Xác định \ P {roperties}
Vẫn còn thêm một vấn đề an ninh nhạy cảm liên quan đến bất động sản Unicode kiểu - như \pM, \p{Pd}, \p{Pattern_Syntax}, hoặc \p{Script=Greek}- đó có thể tồn tại trong một số trình biên dịch regex rằng sự ủng hộ mà ký hiệu.
Vấn đề là trong một số trong số này, tập hợp các thuộc tính có thể là khả năng mở rộng của người dùng. Điều đó có nghĩa là bạn có thể có các thuộc tính tùy chỉnh là các chú thích mã thực tế cho các hàm được đặt tên trong một số tên cụ thể, như \p{GoodChars}hoặc \p{Class::Good_Characters}. Làm thế nào ngôn ngữ của bạn xử lý những người có thể đáng xem.
Hộp cát
Trong Perl, một ngăn hộp cát thông qua Safemô-đun sẽ kiểm soát khả năng hiển thị không gian tên. Các ngôn ngữ khác cung cấp các công nghệ hộp cát tương tự. Nếu các thiết bị như vậy có sẵn, bạn có thể muốn xem xét chúng, bởi vì chúng được thiết kế đặc biệt để thực thi giới hạn mã không tin cậy.