Kullanıcıların sunucunun değişkenleri değiştireceği dizeleri sağlayabilecekleri bir web uygulaması üzerinde çalışıyorum.Python dizesi .format() güvenilmeyen biçim dizeleri için güvenli hale getirilebilir mi?
Tercihen PEP 3101 format() sözdizimini kullanmak istiyorum ve Güvenilmeyen girdiler için güvenli hale getirmek için Biçimlendirici'de geçersiz kılma yöntemlerinin uygulanabilirliğine bakıyorum. .
- Dolgu sen '{:> 9999999999}' böylece, keyfi uzunluklarını belirtmenizi sağlar:
İşte bu haliyle I) .format (görebildiğimiz riskler biçimi (..) çalıştırabilir Sunucu belleği yetersiz ve bir DOS ol. Bunu devre dışı bırakmam gerek.
- Biçim, nesnelerin içindeki alanlara erişmenizi sağlar; bu da yararlıdır, ancak dunder değişkenlerine erişebildiğiniz ve standart kitaplığın bitlerine delik açmaya başladığınız için ürkütücüdür. Yan etkileri olan veya gizli bir şey döndüren bir getattr() nerede olabileceğini anlatan bir şey yok. Get_field() öğesini geçersiz kılarak öznitelik/dizin erişimini beyaz listeye eklerdim.
- Doğal olarak bazı özel durumları yakalamam gerekir.
Benim varsayımlar şunlardır: bir parametre belirterek doğrudan parçacığının yığını kapalı haşhaş yerine, bir koleksiyona bir sınırlarla denetlenir erişim çünkü geleneksel C biçim dizesi patlatır
- Yok, Python için geçerli .
- Kullanmakta olduğum web çerçevesi, bir sayfa şablonuna değiştirilen her değişkenden kaçıyor ve çıkıştan önceki son durak olduğu sürece, devre dışı bırakma nedeniyle ortaya çıkan siteler arası komut dosyası saldırılarından eminim.
Düşünceleriniz nelerdir? Mümkün? İmkansız? Sadece doğru değil mi?
Düzenleme: Armin Ronacher Eğer Dunder değişken erişimi filtrelemek yoksa kötü bilgi sızıntısı çizmiştir, ancak formatını() olarak uygulanabilir güvence gözle bakıyor gibi:
{local_foo.__init__.__globals__[secret_global]}
http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/
(Şahsen, aslında ürünümde güvenilmeyen biçem() yoluna gitmedim, ancak tam anlamıyla güncelleme yapıyorum)
Sesler yanlış geliyor. 'Replace()' yi kullanamaz mısın? – grc
Eh, bir başlangıç için replace(), dizede olabilecek her değişken için bir geçişe ihtiyaç duyar ve bu da korkunç şekilde ölçeklenir. –
Lemmie, bunu düzenleme şansımı kaçırırken gördüğüm kadar genişliyor. Kullanım durumum, çok sayıda olası değişkenle bir ton dizilim biçimlendirmesi yapacağım MUD benzeri bir durum. Geri Bildirim Ver Daha fazla bilgi Daha fazla bilgi Daha fazla bilgi >> string.Template' gibi daha zayıf bir dize biçimlendirmesi biçimine geri dönebilirim, ancak nesneler içindeki alanlara başvurmak da benim durumumda çok kullanışlıdır. Her aramanın her argümanından bir parametre haritası oluşturarak öykünebileceğim bir şey, ama daha iyi ölçeklenebilecek bir şey elde etmenin güven verici olması. –