Hizmet Reddi Endişeleri
Regexes ile ilgili en yaygın endişe, üstel olan - hatta süper üslü olan patolojik örüntülerle reddedilen bir hizmet attack saldırısıdır! - ve böylece çözülmesi sonsuza dek sürecek gibi görünüyor. Bunlar yalnızca belirli girdi verilerinde görünebilir, ancak genellikle bunun önemli olmadığı bir veri yaratılabilir.
Bunlardan hangileri kullandığınız regex derleyicisinin ne kadar akıllı olduğuna bağlı olacaktır, çünkü bunların bazıları derleme sırasında tespit edilebilir. Özyineleme uygulayan Regex derleyicilerinde ilerlemenin kontrol edilmemesi için yerleşik bir özyineleme derinliği sayacı vardır.
Russ Cox'un Düzenli İfade Eşleştirmesi hakkındaki 2007 tarihli mükemmel makalesi Basit ve Hızlı Olabilir (ancak Java, Perl, PHP, Python, Ruby, ... 'de yavaştır), hepsi de modern bir SpFA'nın Henry Spencer'in kodundan türemiş gibi görünen yollarından bahseder , ciddi performans düşüşü yaşar, ancak Thompson tarzı bir NFA'nın böyle bir sorunu yoktur.
Yalnızca DFA'lar tarafından çözülebilecek kalıpları kabul ederseniz, bunları bu şekilde derleyebilirsiniz ve bunlar daha hızlı, muhtemelen çok daha hızlı çalışır. Ancak, bunu yapmak zaman alır . Cox makalesinde bu yaklaşımdan ve beraberindeki sorunlardan bahsedilmektedir. Her şey klasik bir zaman-uzay değiş tokuşuna dönüşüyor.
Bir DFA ile, onu oluşturmak için daha fazla zaman harcarsınız (ve daha fazla eyalet tahsis eder), oysa bir NFA ile onu yürütmek için daha fazla zaman harcarsınız, çünkü aynı anda birden fazla durum olabilir ve geri izleme öğle yemeğinizi ve CPU'nuzu yiyebilir.
Reddetme ‐ Hizmet Çözümleri
Evrenin sıcak ölümüyle bir yarışın kaybedilen ucundaki bu kalıpları ele almanın muhtemelen en makul yolu, onları, çalıştırılmaları için izin verilen maksimum süreyi etkili bir şekilde yerleştiren bir zamanlayıcı ile sarmaktır. Genellikle bu, çoğu HTTP sunucusunun sağladığı varsayılan zaman aşımından çok, çok daha az olacaktır.
Bunları uygulamak alarm(N)
için, C düzeyinde basit bir form try {}
, yakalama alarmı tipi istisnaları bir tür bloğa kadar, içine yerleştirilmiş bir zamanlama kısıtlamasıyla özel olarak oluşturulmuş yeni bir iş parçacığını ortaya çıkarmanın çeşitli yolları vardır .
Kod Ek Bilgileri
Kod Ek bilgileri itiraf regex dillerde, izin veya derleme gidiyoruz dizesinden bu izin vermeme bazı mekanizma olmalıdır sağlanacaktır. Kod bilgileri yalnızca kullandığınız dilde kodlanacak olsa bile, bunları kısıtlamanız gerekir; harici kod çağırabilmeleri gerekmiyor, ancak yapabiliyorlarsa çok daha büyük sorunlarınız var.
Örneğin, Perl'de use re "eval";
, geçerli kapsamda etkin olan özel olarak sözcüksel olarak hazırlanmış pragma olmadıkça, dize enterpolasyonundan oluşturulan regex'lerde kod belirtme çizgileri olamaz (bunlar çalışma zamanında derlendiği gibi) .
Bu şekilde, hiç kimse, rm -rf *
örneğin sistem programlarını çalıştırmak için bir kod bilgisine gizlice giremez . Kod açıklamaları güvenlik açısından çok hassas olduğundan, Perl bunları enterpolasyonlu dizelerde varsayılan olarak devre dışı bırakır ve bunları yeniden etkinleştirmek için kendi yolunuzdan çıkmanız gerekir.
Kullanıcı ined Tanımlı \ P {roperties}
Gibi - Unicode tarzı özelliklerine ilişkin bir tane daha güvenlik-hassas bir konu var olmaya devam \pM
, \p{Pd}
, \p{Pattern_Syntax}
, veya \p{Script=Greek}
- o olabilir bazı regex derleyici desteğin o notasyonu var.
Sorun, bunlardan bazılarında olası özellikler kümesinin kullanıcı tarafından genişletilebilir olmasıdır. Bu, \p{GoodChars}
veya gibi bazı belirli ad alanlarında adlandırılmış işlevlere gerçek kod belirtimleri olan özel özelliklere sahip olabileceğiniz anlamına gelir \p{Class::Good_Characters}
. Dilinizin bunları nasıl ele aldığına bakmaya değer olabilir.
Korumalı
Perl'de, Safe
modül aracılığıyla korumalı bir bölme, ad alanının görünürlüğü üzerinde kontrol sağlayacaktır. Diğer diller de benzer sanal alan teknolojileri sunmaktadır. Bu tür aygıtlar varsa, bunlara bakmak isteyebilirsiniz, çünkü bunlar güvenilmeyen kodun sınırlı yürütülmesi için özel olarak tasarlanmıştır.