Base64 verilerini doğrulamak veya sterilize etmek için bir RegEx kullanmak mümkün müdür? Basit soru bu, ancak bu soruyu yönlendiren faktörler onu zorlaştıran şeydir.
RFC özelliklerini takip etmek için giriş verilerine tam olarak güvenemeyen bir Base64 kod çözücüm var. Bu yüzden, karşılaştığım sorunlar, belki Base64 verileri gibi 78'e bölünemeyen sorunlar (78 olduğunu düşünüyorum, RFC'yi iki kez kontrol etmem gerekecek, bu yüzden tam sayı yanlışsa beni ding etme) karakter satırlar veya satırların CRLF ile bitmeyebileceğini; sadece bir CR veya LF'ye sahip olabilir veya ikisi de olmayabilir.
Yani, bu şekilde biçimlendirilmiş Base64 verilerini ayrıştırırken çok zaman geçirdim. Bu nedenle, aşağıdaki gibi örneklerin güvenilir bir şekilde çözülmesi imkansız hale gelir. Kısaca sadece kısmi MIME başlıklarını göstereceğim.
Content-Transfer-Encoding: base64
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
Tamam, bu yüzden ayrıştırmak sorun değil ve tam da beklediğimiz sonuç. Ve vakaların% 99'unda, en azından arabellekteki her bir karakterin geçerli bir base64 karakter olduğunu doğrulamak için herhangi bir kod kullanmak mükemmel çalışıyor. Ancak, bir sonraki örnek karışıma bir anahtar fırlatıyor.
Content-Transfer-Encoding: base64
http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
Bu, bazı virüslerde ve bazı posta okuyucularından yararlanmaya çalışan bazı diğer şeylerde gördüğüm bir Base64 kodlama sürümü, kesinlikle kitaba veya daha doğrusu RFC'ye göre, her ne pahasına olursa olsun mime ayrıştırmak istiyor; eğer yapacaksan.
Base64 kod çözücüm, ikinci örneği aşağıdaki veri akışına çözer. Ve burada unutmayın, orijinal akışın tüm ASCII verileri!
[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8
Her iki sorunu da aynı anda çözmenin iyi bir yolu olan var mı? Farklı kurallar uygulanarak veriler üzerinde iki dönüşüm yapmak ve sonuçları karşılaştırmak dışında bunun mümkün olduğundan bile emin değilim. Ancak bu yaklaşımı benimserseniz, hangi çıktıya güvenirsiniz? Görünüşe göre ASCII buluşsal yöntemi en iyi çözümle ilgilidir, ancak bu, bu kodun gerçekte dahil olduğu bir virüs tarayıcısı kadar karmaşık bir şeye ne kadar daha fazla kod, yürütme süresi ve karmaşıklık ekler? Base64'ün kabul edilebilir olup olmadığını öğrenmek için sezgisel motoru nasıl eğitirsiniz?
GÜNCELLEME:
Bu sorunun almaya devam ettiği görünümlerin sayısını yapın, 3 yıldır bir C # uygulamasında kullandığım basit RegEx'i yüz binlerce işlemle göndermeye karar verdim. Dürüst olmak gerekirse, Gumbo'nun verdiği cevabı en çok beğendim , bu yüzden onu seçilen cevap olarak seçtim. Ancak C # kullanan ve en azından bir dizenin veya baytın [] geçerli Base64 verisi içerip içermediğini tespit etmenin çok hızlı bir yolunu arayanlar için, aşağıdakilerin benim için çok iyi çalıştığını buldum.
[^-A-Za-z0-9+/=]|=[^=]|={3,}$
Ve evet, bu sadece bir içindir STRING Base64 verilerine DEĞİL düzgün şekilde biçimlendirilmiş bir RFC1341 mesajının. Bu nedenle, bu tür verilerle uğraşıyorsanız, lütfen yukarıdaki Normal İfadeyi kullanmaya çalışmadan önce bunu dikkate alın. Eğer Base16, Base32, Radix veya diğer amaçlarla (URL'ler, dosya adları, XML Kodlama, vs.) için bile Base64 ile ilgileniyor, o zaman olduğu son derece okumak öneririz RFC4648 o Bamya iyi olması gerekir olarak onun cevapta belirtildiği Bu soru / cevap setindeki önerileri kullanmaya başlamadan önce uygulama tarafından kullanılan karakter seti ve sonlandırıcıların farkında olmak.