· kaynak dev.to (home feed)
Python ve Rust'ta sözlük desen eşleştirmesi fazladan anahtarları sessizce yok sayar
dev.to'da yer alan bir yazı, Python ve Rust gibi dillerdeki sözlük desenlerinin fazladan anahtar taşıyan eşlemeleri eşleştirdiğini ve bu anahtarları yok saydığı konusunda uyarıyor; dolayısıyla katı biçim doğrulaması varsayan kodlar hatalı veriyi geçirebilir.

Uyuşmazlık neyden ibaret
Desen eşleştirmesi, geliştiricilerin yapılandırılmış veriden değerleri tek bir ifadede çıkarmasını sağlar ve romdevin'in dev.to'da yayımladığı güncel bir yazı, deneyimli programcıları bile zorlayabilecek bir inceliğe dikkat çekiyor. Yazının ele aldığı dillerde, örneğin Python ve Rust'ta, sözlüklere karşı yazılan desenler katı bir biçim dayatmaz. Bir dizi (sequence) deseni yalnızca hedef tam olarak beklenen öğeleri içerdiğinde başarılı olur; bir sözlük deseni ise adını verdiği anahtarlar doğru değerlerle mevcut olduğu sürece başarılı olur. Sözlükteki diğer her şey incelenmeden kalır.
Yazının merkezindeki örnek şöyle: a ve b anahtarları için bir desen yazın, sonra bu desene c anahtarını da içeren bir sözlük verin. Eşleşme başarılı olur ve c herhangi bir hata ya da uyarı olmadan yok sayılır.
Geliştiriciler neden tuzağa düşüyor
Yazara göre tuzak, genelleme yapmaktan kaynaklanıyor. Dizi desenlerinin tam bir uyum talep ettiğini bilen programcılar, doğal olarak sözlük desenlerinin de aynı şekilde davrandığını varsayıyor; oysa dil tasarımı aslında esneklikten yana tercih yapıyor. Bu esneklik, yükler meşru olarak biçim değiştirdiğinde işe yarar ama değişmemeleri gerektiğinde tehlikelidir. Yazı ayrıca belgelerin bu davranışı nadiren açıkça belirttiğini, dolayısıyla yanlış varsayımın bir şeyler kırılana dek sürdüğünü savunuyor.
Nerede sorun çıkardığı senaryolar
dev.to yazısı birkaç başarısızlık biçimi çiziyor:
- Finansal işleme: bir sistem, işlem kaydından amount ve currency değerlerini çıkarmak için bir desen kullanıyor. Saldırgan override_amount gibi fazladan bir anahtar sızdırıyor. Desen eşleşiyor, doğrulama geçiyor ve fazlalık anahtar, başka bir kodun üzerinde işlem yapabileceği akışın aşağısına doğru ilerliyor.
- Kimlik bilgisi denetimi: username ve password kapsayan bir desen, ayrıca enjekte edilmiş bir admin_access bayrağı taşıyan sözlükle eşleşiyor; sonraki mantık bu anahtara güvenirse ayrıcalıklar yükseltilebilir.
- İç içe veri: anahtarlar iç içe bir yapının her düzeyinde yok sayıldığı için hatalar birikerek izini sürmeyi belirgin biçimde zorlaştırabilir.
Yazıya göre ortak nokta sessizlik. Hiçbir şey istisna fırlatmıyor ve hiçbir şey loglamıyor, dolayısıyla hatalı ya da kötü niyetli veri fark edilmeden akmaya devam ediyor.
Boşluğu nasıl kapatmalı
Önerilen çözüm, desen eşleştirmeyi doğrulama olarak görmeyi bırakmaktır. Tam bir biçim önemli olduğunda, eşleştirmeden önce anahtar kümesini açıkça denetleyin; yazının Python örneği, fazladan herhangi bir anahtarın hızlıca başarısız olması için set(d.keys()) değerini beklenen anahtarlarla karşılaştırıyor. Yazarın pratik kuralı: güvenliğe duyarlı ya da finansal kodda, beklenmeyen girdiyi reddetmek için desenin kendisine güvenmek yerine sözlük anahtarlarını her zaman önceden doğrulayın.
Neden önemli
Desen eşleştirmesi, JSON yükleri, API gövdeleri ve yapılandırma gibi harici girdileri ayrıştırırken geliştiricilerin başvurduğu ilk araç olmaya giderek daha çok yaklaşıyor; üstelik bu tam olarak bir saldırganın ya da hatalı bir istemcinin denetlediği veridir. Fazladan anahtarlar istisna yükseltmediği için, iyi biçimlendirilmiş fixture'lara dayanan sıradan testler bu boşluğu asla ortaya çıkarmaz; görünen ilk belirti bozuk kayıtlar ya da bir ayrıcalık yükseltmesi olabilir. Çare ucuzdur, çünkü açık bir anahtar kümesi karşılaştırması yeterlidir; ders ise daha geneldir: bir dil yapısını kapı bekçisi olarak kullanmadan önce hangi garantileri gerçekten sağladığını anlayın, çünkü kolaylık için tasarlanmış özellikler nadiren doğrulayıcı olarak da iş görür.
- #pattern-matching
- #python
- #rust
- #data-validation
- #debugging