Saya mengetahui penolakan layanan ekspresi reguler (ReDoS). Apakah ada cara yang masuk akal untuk memungkinkan pengguna membuat regex khusus sambil memastikan bahwa mereka tidak mengirimkan pola yang lambat secara eksponensial?
Saya mengetahui penolakan layanan ekspresi reguler (ReDoS). Apakah ada cara yang masuk akal untuk memungkinkan pengguna membuat regex khusus sambil memastikan bahwa mereka tidak mengirimkan pola yang lambat secara eksponensial?
Jawaban:
Masalah dengan ekspresi reguler bukanlah regex itu sendiri, tetapi bahwa mesin regex yang memiliki semua jenis fitur "nyaman" seperti mundur. Karena itu, menggunakan mesin regex tanpa fitur-fitur ini menghindari.
Ekspresi reguler konsep ilmu komputer selalu dapat dicocokkan dalam waktu linier setelah mereka dikompilasi ke mesin keadaan terbatas. Jadi mesin regex berbasis mesin negara tidak dapat digunakan untuk ReDoS. Namun, mesin negara yang diperlukan mungkin menjadi agak besar dalam contoh patologis. Tetapi membatasi memori yang tersedia cenderung lebih mudah daripada membatasi waktu komputasi yang tersedia.
Mesin RE2 dikembangkan secara khusus untuk menangani regex yang tidak terpercaya dan dirancang untuk eksekusi linear-time.
Alternatif lain adalah merakit regex sendiri dari notasi yang disederhanakan. Misalnya, Anda mungkin mengizinkan pengguna menggunakan pola glob (seperti *.txt
). Anda kemudian dapat menguraikannya dengan cara yang mencegah backtracking, misalnya dengan melarang bersarang dan hanya menggunakan quantifier serakah. Untuk banyak kasus penggunaan, notasi pola yang disederhanakan sepenuhnya memadai.
Menganalisis ekspresi reguler untuk melihat apakah akan lambat atau tidak, tanpa analisis menjadi lambat itu sendiri , sama dengan memecahkan masalah yang berhenti. Dengan kata lain, tidak mungkin menemukan solusi yang benar dan lengkap.
Anda dapat, tentu saja, menemukan solusi yang benar dan di lengkap. Misalnya, Anda dapat bekerja dengan daftar putih terbatas fitur yang aman digunakan (mis. Kelas karakter ya, tidak ada pengulangan ...). Ini akan memungkinkan Anda untuk melewati banyak regex tidak kritis, menolak semua yang kritis, dan (salah) menolak beberapa yang baik-baik saja, tetapi terlalu rumit untuk membuktikan aman secara otomatis.
Sebagai penulis re parser untuk proyek lazarus saya akan mengatakan tidak ada cara untuk memahami ekspresi reguler yang diberikan sumber daya apa yang akan dikonsumsi pada teks yang diberikan.
Tanpa menghabiskan sumber daya yang sama yang saya maksud (setidaknya dalam arti besar-O).
Jadi pendekatan terbaik - jalankan kembali parser di utas terpisah dan bunuh setelah waktu habis.
Selain jawaban lain, solusi mungkin juga untuk menggulung perpustakaan regex Anda sendiri, yang memungkinkan instrumentasi kinerja selama eksekusi, dan dengan demikian menyediakan sarana untuk membunuh eksekusi setengah jalan jika beberapa kriteria terpenuhi.
Demikian pula, Anda bisa menjalankan regex di utas lain dan membunuh utas jika terlalu lama.