Hook regex adalah engine keamanan regex deterministik yang dijalankan spesialisasi regex, dan Anda juga bisa menjalankannya sendiri. Hook ini bekerja dalam dua mode dari satu perintah: scan yang memindai basis kode untuk mencari pola yang rawan ReDoS dan pola yang dibangun saat runtime, serta check yang memberi skor satu pola yang Anda berikan.
Memindai basis kode
Tanpa flag, hook ini memindai seluruh proyek. --dir membatasi pemindaian ke satu direktori, --file ke satu file. Keduanya bisa diulang dan digabung menjadi satu laporan, dengan setiap file dicantumkan sekali meski tercakup oleh lebih dari satu target.
- Seluruh proyek
- Satu direktori
- Satu file
- Beberapa target
- Dengan batas
npx lagune read regex
npx lagune read regex --dir src/services
npx lagune read regex --file bin/import.pl
npx lagune read regex --dir core --dir workers --file Sources/App/Router.swift
--limit menetapkan ambang ReDoS untuk pemindaian (default 25), batas yang sama yang diterima mode check. Batas yang lebih rendah lebih ketat.
npx lagune read regex --dir src/services --limit 15
Output-nya berupa teks mentah, dan header-nya menjelaskan cara membaca tiap bagian. Sebuah bagian hanya ditampilkan jika ada temuan.
Vulnerable regular expressions found:
cmd/server/main.go
([a-z]+)+$ (exponential, search)
Dynamically built regular expressions (review manually by simulating a constructed regex):
app/payments.php
crates/parser/lexer.rs
lib/validate.py
Static regex wrapped in a constructor (use a literal instead):
config/token.rb
Jika tidak ada yang ditemukan, hook ini mencetak satu baris.
npx lagune read regex --dir src/clean
# => no unsafe patterns found
Cara membaca tiap bagian
| Bagian | Arti |
|---|---|
Vulnerable regular expressions found | Pola yang rawan ReDoS, dikelompokkan per file dengan setiap pola menjorok di bawahnya, diikuti dalam tanda kurung oleh alasan pola itu tidak aman serta, jika ada, cakupan dan flag-nya. Setiap baris tidak aman, jadi putusannya tidak diulang. |
Regular expressions the analysis could not settle (review manually) | Pola yang tidak bisa dipastikan oleh analisis dalam batas kerjanya, dicantumkan dengan cara yang sama. |
Dynamically built regular expressions (review manually by simulating a constructed regex) | File yang membangun regex dari variabel, konkatenasi, atau interpolasi. |
Static regex wrapped in a constructor (use a literal instead) | File yang meneruskan string literal biasa ke konstruktor regex, padahal literal regex lebih sederhana dan tidak perlu dikompilasi saat runtime. |
Bagian pertama adalah temuan keamanan. Bagian kedua dan ketiga bukan temuan dengan sendirinya: keduanya menunjuk kode yang tidak bisa dipastikan oleh pemeriksaan statis, jadi perlu dibaca manusia. Bagian keempat adalah petunjuk kejelasan, bukan temuan keamanan.
Opsi CLI
| Opsi | Nilai | Deskripsi |
|---|---|---|
--pattern | sumber regex | Periksa satu pola. Ulangi untuk memeriksa beberapa pola, satu putusan per pola, sesuai urutan. |
--flags | flag regex | Periksa setiap --pattern dengan flag ini, seperti im. Hanya berlaku untuk mode check. |
--dir | direktori | Batasi pemindaian ke satu direktori. Bisa diulang dan digabung dengan --file. |
--file | file | Batasi pemindaian ke satu file. Bisa diulang dan digabung dengan --dir. |
--limit | bilangan bulat non-negatif | Tetapkan batas repetisi ReDoS (default 25). Berlaku untuk kedua mode. Batas yang lebih rendah lebih ketat. |
Tanpa opsi, hook ini memindai seluruh proyek. --pattern adalah mode check dan tidak bisa digabung dengan --dir atau --file.
Pilih yang dipindai
Hook ini melewati apa yang diabaikan Git. Untuk melewati lebih banyak, atau untuk memindai apa yang diabaikan Git, beri regex pengaturannya sendiri:
npx lagune write add --ignore test/fixtures --checker regex
{
"checkers": {
"regex": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}
Semua pengaturan dibahas di Mengonfigurasi hook.
Bahasa yang didukung
Pemindaian membaca bahasa berikut, dikenali dari ekstensi file, masing-masing dengan aturannya sendiri sehingga pola dari satu bahasa tidak pernah diuji dengan aturan bahasa lain. Bahasa lain dilewati, bukan dipindai dengan aturan yang salah.
| # | Bahasa | Ekstensi |
|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot |
| 2 | Python | .py, .pyi |
| 3 | Ruby | .rb |
| 4 | Go | .go |
| 5 | PHP | .php |
| 6 | Rust | .rs |
| 7 | Java | .java |
| 8 | C# | .cs |
| 9 | C | .c, .h |
| 10 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx |
| 11 | Kotlin | .kt, .kts |
| 12 | Swift | .swift |
| 13 | Scala | .scala, .sc |
| 14 | Dart | .dart |
| 15 | PowerShell | .ps1, .psm1, .psd1 |
| 16 | Elixir | .ex, .exs |
| 17 | Objective-C | .m, .mm |
| 18 | R | .r |
| 19 | Julia | .jl |
| 20 | Clojure | .clj, .cljs, .cljc, .edn |
| 21 | Crystal | .cr |
| 22 | Nim | .nim, .nims |
| 23 | V | .v |
| 24 | D | .d |
| 25 | Perl | .pl, .pm |
Hook ini membaca kode sumber sebagai teks, sehingga tidak bisa menilai pola yang dirakit saat runtime, dan pola yang tersebar di beberapa baris, tersembunyi di balik alias, atau ditulis dalam bentuk yang tidak dikenalinya bisa lolos. Anggap bagian-bagian ini sebagai titik awal yang kuat, bukan inventaris lengkap, dan tetap baca kodenya untuk hal yang tidak terjangkau olehnya.
Memeriksa satu pola
Berikan --pattern dengan sumber pola untuk memberinya skor. Hook ini mencetak satu kata: safe, unsafe, undetermined jika analisis mencapai batas kerjanya sebelum bisa memastikan pola, atau invalid regex. Ulangi --pattern untuk memberi skor beberapa pola sekaligus, satu putusan per pola, sesuai urutan.
- Satu pola
- Beberapa pola
- Dengan flag
- Dengan batas
npx lagune read regex --pattern '(a+)+$'
# => unsafe
npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
npx lagune read regex --pattern '(a+)+$' --pattern '^[a-z]+$'
# => unsafe
# => safe
--flags memeriksa setiap --pattern dalam pemanggilan itu dengan flag yang dipakainya saat berjalan, karena flag mengubah karakter mana yang dicocokkan sebuah pola.
npx lagune read regex --pattern '^(?:a|A)+$'
# => safe
npx lagune read regex --pattern '^(?:a|A)+$' --flags 'i'
# => unsafe
--limit menetapkan batas repetisi (default 25) dan berlaku untuk setiap --pattern dalam pemanggilan itu. Batas yang lebih rendah lebih ketat.
npx lagune read regex --pattern 'a?a?a?' --limit 2
# => unsafe
Setiap pola diteruskan sebagai nilai flag, tidak pernah disisipkan ke dalam perintah. Nilai yang berisi tanda kutip atau backtick tetap tidak berbahaya dan tidak bisa melakukan injeksi ke shell. Selalu apit pola dengan tanda kutip tunggal agar shell Anda tidak mengekspansinya lebih dulu.
Ini adalah engine yang sama yang dijalankan spesialisasi regex: scan membuka pemeriksaan ReDoS, dan check memastikan pola yang ditemukannya.
Pertanyaan yang sering diajukan
Jalankan npx lagune read regex --pattern '<pattern>'. Hasilnya safe, unsafe, undetermined, atau invalid regex.
Jalankan hook regex dalam mode scan di seluruh basis kode. Hook ini melaporkan pola yang rawan ReDoS di 25 bahasa yang didukung.
