2013-03-12 18 views
13

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)

+0

Sesler yanlış geliyor. 'Replace()' yi kullanamaz mısın? – grc

+0

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. –

+0

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ı. –

cevap

5

İyi içgüdü. Evet, bir saldırganın keyfi biçim dizesi sunabilmesi, python altında bir güvenlik açığıdır.

  • Hizmet reddi, büyük olasılıkla adres için en basit olanıdır. 'da, bu durumda, dizgenin boyutunu veya dizgideki operatör sayısını sınırlamak, bu sorunu hafifletecektir. ayarında, makul bir kullanıcının X'den daha fazla değişken içeren bir dize oluşturması gerekmeyeceği ve bu hesaplama miktarının DoS saldırısında istismar edilmesinin riskinde olmadığı belirtilmelidir.
  • Nesneye ait niteliklere erişebilmek tehlikeli olabilir. Ancak, Object ana sınıfının yararlı bilgisine sahip olduğunu sanmıyorum.Biçime sağlanan nesne, hassas bir şey içermelidir. Her durumda, bu tür bir gösterim, düzenli ifade ile 'u sınırlayabilir.
  • Biçim dizeleri kullanıcı tarafından sağlanıyorsa, kullanıcının hata ayıklama için hata mesajını bilmesi gerekebilir. Ancak, hata meseleleri yerel yollar veya sınıf adları gibi sıralı bilgiler içerebilir. Saldırganın alabileceği bilgileri sınırlamak için 'u doğrulayın.

python format string specification'a bakın ve kullanıcının bir normal ifadeye sahip olmasını istemediğiniz işlevselliği yasaklayın.

+7

Veya daha iyisi, * izin vermek istediğiniz işlevsellik *, böylece yeni (ve potansiyel olarak tehlikeli) format seçenekleriyle yeni bir Python sürümüne yükselttiğinizde, yakalanamazsınız. – Michael

+0

@Michael evet beyaz bir yaklaşımın daha iyi olacağını kabul ediyorum. – rook

İlgili konular