Kural
Muhafız karşı yavaş düzenli ifadeler.
Düzenli ifadeler iç içe iç içe miktar belirleyicileri veya
belirsiz desenler olabilir neden olabilir felaket
geri izleme ve performans sorunlarına yol açabilir.
Desteklenen diller: 45+Giriş
Düzenli ifadeler, uygun bir girdi ile uygulamanızı saniyelerce veya dakikalarca dondurabilir. Felaket düzeyinde geri izleme, düzenli ifade motorlarının bir deseni eşleştirmeye çalışırken katlanarak artan yolları taraması durumunda ortaya çıkar. Şu gibi bir düzenli ifade: (a+)+b Geçerli bir girdiyi eşleştirmek mikrosaniyeler sürer, ancak sonuna b harfi eklenmemiş a harflerinden oluşan bir dizgiyi reddetmek saatler sürebilir. Saldırganlar, bu durumu Düzenli İfade Hizmet Reddi (ReDoS) saldırıları yoluyla istismar eder; istek zaman aşımına uğrayana veya işlem çökene kadar düzenli ifade motorunuzun CPU’yu %100 oranında tüketmesine neden olacak şekilde özel olarak hazırlanmış girdiler gönderirler.
Neden önemli?
Güvenlik etkileri (ReDoS saldırıları): Bir saldırgan, özel olarak hazırlanmış girdi içeren tek bir istekle uygulamanızı felç edebilir. E-posta doğrulama ve URL ayrıştırma kalıpları sıkça hedef alınan alanlardır. Bant genişliği gerektiren geleneksel DoS saldırılarının aksine, ReDoS saldırıları yalnızca çok küçük yükler gerektirir.
Performans düşüşü: Normal kullanıcı girdileri, felaket niteliğinde bir geri izlemeyi tetikleyerek yanıt sürelerinin milisaniyelerden saniyelere çıkmasına neden olabilir. Bu durum, yalnızca belirli girdi kalıplarında ortaya çıktığı için hata ayıklaması zor olan, öngörülemez bir gecikmeye yol açar.
Üretim ortamındaki sorunlar: Güvenlik açığı bulunan bir düzenli ifade (regex), Node.js’deki olay döngüsünü engeller veya iş parçacığı havuzu kaynaklarını tüketir. İstekler birikmeye başladıkça bellek kullanımı artar ve sistem yanıt vermez hale gelir. Mikro hizmetlerde, güvenlik açığı bulunan tek bir düzenli ifade, hataları bağımlı hizmetlere zincirleme olarak yayar.
Tespit zorluğu: Kısa girdilerle yapılan testlerde sorunsuz çalışan kalıplar, daha uzun girdilerde katlanarak yavaşlar. Bu güvenlik açığı genellikle üretim ortamına geçene kadar fark edilmez ve aktif bir olay sırasında acil durum dağıtımı gerektirir.
Kod örnekleri
❌ Uygun değil:
function validateEmail(email) {
const regex = /^([a-zA-Z0-9_\-\.]+)+@([a-zA-Z0-9_\-\.]+)+\.([a-zA-Z]{2,5})$/;
return regex.test(email);
}
function extractURLs(text) {
const regex = /(https?:\/\/)?([\w\-])+\.(\w+)+([\w\-\.,@?^=%&:/~\+#]*)+/g;
return text.match(regex);
}
Neden güvenli değil: İç içe geçmiş niceleyiciler ([a-zA-Z0-9_\\-\\.]+)+ üstel geri izleme oluşturun. Şu tür bir e-posta için: aaaaaaaaaaaaaaaaaaaaaaaaa!, düzenli ifade motoru hata vermeden önce sayısız kombinasyonu dener. URL düzenli ifadesinde, sorunu daha da karmaşık hale getiren birden fazla iç içe geçmiş nicelik belirleyicisi bulunur; bu da, beklenen yapıya sahip olmayan uzun geçerli karakter dizileri gibi girdilerle bu ifadenin son derece kolay bir şekilde istismar edilmesine yol açar.
✅ Uygunluk:
function validateEmail(email) {
const regex = /^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]{2,5}$/;
return regex.test(email);
}
function extractURLs(text) {
const regex = /https?:\/\/[\w\-]+\.[\w\-]+(?:[\w\-\.,@?^=%&:/~\+#]*)?/g;
return text.match(regex);
}
Neden güvenlidir: İç içe geçmiş niceleyicilerin kaldırılması, felaket niteliğindeki geri izlemeyi ortadan kaldırır. [a-zA-Z0-9_\-\.]+ gibi tek niceleyiciler doğrusal sürede çalışır. URL kalıbı, iç içe geçmiş tekrarlar yerine isteğe bağlı sonek (?:...)? içeren yakalamayan gruplar kullanır; bu da giriş uzunluğu veya içeriğinden bağımsız olarak öngörülebilir bir performans sağlar.
Sonuç
Düzenli ifadelerin performansı, sadece bir optimizasyon meselesi değil, aynı zamanda bir güvenlik sorunudur. Tüm düzenli ifade kalıplarını, iç içe geçmiş nicelik belirleyiciler, tekrar gruplarında çakışan karakter sınıfları ve belirsiz alternatifler açısından gözden geçirin. Düzenli ifade kalıplarını, patolojik girdilerle (geçerli karakterlerden oluşan uzun dizelerin ardından gelen geçersiz son ekler) test ederek, devreye almadan önce felaket niteliğinde geri izleme durumlarını tespit edin. Mümkün olduğunda, karmaşık düzenli ifadeleri, öngörülebilir performans özelliklerine sahip dize ayrıştırma işlevleriyle değiştirin.

