SORU
28 HAZİRAN 2011, Salı


Nasıl Python SQLite tablo/sütun adları için dizeleri kaçış mı?

SQLite sorgu içinde değişken değerleri kullanarak standart yaklaşım "soru işareti stili", bu gibi:

import sqlite3
with sqlite3.connect(":memory:") as connection:
    connection.execute("CREATE TABLE foo(bar)")
    connection.execute("INSERT INTO foo(bar) VALUES (?)", ("cow",))

    print(list(connection.execute("SELECT * from foo")))
    # prints [(u'cow',)]

Ancak, bu sadece sorguları içine değiştirme değerleri için çalışıyor. Tablo veya sütun adları için kullanılan zaman başarısız:

import sqlite3
with sqlite3.connect(":memory:") as connection:
    connection.execute("CREATE TABLE foo(?)", ("bar",))
    # raises sqlite3.OperationalError: near "?": syntax error

Ne sqlite3 modül ne de PEP 249 isimler veya değerler kaçmak için bir işlev söz. Muhtemelen bu dizeleri ile sorgular montaj kullanıcıların vazgeçirmek için, ama beni habersiz bırakır.

Ne işlevi ya da teknik SQLite sütun veya tablo için değişken isimleri kullanmak için en uygun olur? Ki güçlü bir şekilde kendi ambalajında kullanacağım beri diğer bağımlılıklar olmadan bunu yapmak mümkün yapmayı tercih ederim.

Aradım ama benim kendi işlevi yazmak üzere SQLite sözdizimi, en önemli kısmı, net ve tam bir açıklama bulamadım. Bu deneme-yanılma çözüm benim için çok belirsiz yani herhangi bir tanımlayıcı SQLite izin verdiği için çalışacak emin olmak istiyorum.

SQLite uses " to quote identifiers ama sadece onlardan kaçmak yeterli olduğundan emin değilim. PHP sqlite_escape_string işlevi belgelerine bazı ikili veri de kaçmış olabilir önerir, ama bu PHP Kütüphanesi bir cilvesi olabilir.

CEVAP
29 HAZİRAN 2011, ÇARŞAMBA


psycopg2 belgeleri açıkça önerir kullanarak normal python % veya {} biçimlendirme yerine tablo ve sütun adları (veya başka bir bit dinamik sözdizimi), ve sonra kullanarak parametre mekanizması yerine değerleri içine sorgu.

Demek herkes katılmıyorum "eğer ihtiyacınız varsa bir şeyler yanlış yapıyorsun dinamik tablo/sütun adları kullanmayın". Veritabanlarıyla şeyler her gün otomatikleştirme için program yazıyorum ve bunu her zaman yaparım. Çok sayıda tablo ile bir veritabanı var, ama onlarla baş etmek için genel kod çok tekrarlanan kalıpları üzerine inşa edilmişson dereceyararlı. El yazma sorgular her zaman çok daha fazla hata eğilimli ve tehlikeli olabilir.

"" Anlamına gelir. güvenli bir yere gelir Geleneksel bilgelik normal python string manipülasyon sorguları içine değerleri koymak için kullanarak değil "" güvenli. Bu eğer bunu yaparsanız, ters gidebilecek şeyler vardır çünkü ve bu veri çok sık kullanıcıdan geliyor ve sizin kontrolünüzde değil. Bir kullanıcı bir veri değeri SQL enjeksiyon ve veritabanı çalıştırmak zorunda ki bu değerler doğru kaçan 0 güvenilir bir yol gerekir. Kütüphane yazarlar bu işi çok; asla.

Ancak veritabanlarında şeyler üzerinde çalışmaya genel yardımcı kod yazıyorsanız, o zaman bu konuları da çok geçerli değil. Örtülü olarak veritabanındaki her şey için böyle bir kod erişim Ara herkes veriyorsun;yardımcı kod noktası. Şimdi de güvenlik kaygısı kullanıcı tarafından oluşturulan veri hiç böyle bir kod kullanılabilir emin olmak. Bu kodlama, genel bir güvenlik sorunu olduğunu ve körü körüne execıng kullanıcı giriş dizesi olarak sadece aynı sorun. Ekleme ayrı bir konudeğerlersorguları, çünkü orada senistiyorumedebilmek içingüvenli bir şekildekullanıcı giriş verileri işlemek.

Benim önerim şu: dinamik olarak istediğiniz sorguları toplanın ne yaparsanız yapın. Normal python dize şablon maddeleri ile birleştiği tablo ve sütun adları, tutkal alt etmek için kullanın, tüm iyi (ve) korkunç bir hata ayıklama şeyler. Ama bu kod dokunur değerleri ne olursa olsun gelmeli farkında olduğunuzdan emin olunsanakullanıcılarınız[1]. Sonra SQLite parametre değiştirme işlevi için kullanıngüvenli bir şekildekullanıcı giriş değerleri olarak Ekle sorguları içine değerleri.

[1] Eğer yazdığım kod bir çok şey için olduğu gibi) kullanıcılarınneyse veritabanları için tam erişimi olan insanlar ve kod işlerini kolaylaştırmak için, o zaman bu düşünce pek geçerli değil; muhtemelen kullanıcı tarafından belirtilen tablolar sorgular toplanıyor. Ama hala SQLite parametre değiştirme sonunda tırnak veya yüzde işaretleri içeren kaçınılmaz gerçek değerini kendinizi kurtarmak için kullanmalısınız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kupa World

    Kupa World

    1 EYLÜL 2011
  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • michal lelkowski

    michal lelko

    9 Temmuz 2006