2012-11-28 14 views
9

Başlıktan anlaşılacağı gibi, bu kodun SQL Injection'a karşı hassas olup olmadığını bilmek ister misiniz? Ve eğer öyleyse, aynı şeyi elde etmenin daha iyi, daha güvenli bir yolu var mı?Bu Python kodu SQL enjeksiyonuna karşı savunmasız mı? (SQLite3)

def add(table,*args): 
    statement="INSERT INTO %s VALUES %s" % (table,args) 
    cursor.execute(statement) 
+1

Nesin, SQL yerleştirme üzerinde okumak öneririz. Bunu çok açık hale getirmeli. –

cevap

21

Evet, öyle. bunu önlemek için böyle bir şey kullanın: Eğer böyle tabloyu giremezsiniz

cursor.execute("INSERT INTO table VALUES ?", args) 

Not. İdeal olarak, tablonun herhangi bir kullanıcı girdisinden gelmesi şartıyla, kodlanmış olması gerekir. Tablo için yaptığınız şeye benzer bir dize kullanabilirsiniz, ancak bir kullanıcının bunu bir şekilde değiştiremeyeceğinden% 100 emin olun ... Daha fazla bilgi için Can I use parameters for the table name in sqlite3?'a bakın.

Esasen, veri veritabanı güvenli hale getirmek için emin olun, çünkü imleç komutu parametreleri koymak istiyorum. İlk komutunuzla, güvenli olmayan SQL kodunuza bir şey koyan özel bir table veya args yapmak nispeten kolaydır. python pages ve başvurulan http://xkcd.com/327/'a bakın. Özellikle, piton sayfalar alıntı:

Temelde

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see http://xkcd.com/327/ for humorous example of what can go wrong).

Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.)

, birisi, böyle bir şey başka bir emir yürütülen bir args ayarlayabilirsiniz:

args="name; DELETE table" 

böylece verilen değer şeyler olacak cursor.execute kullanma argüman listelenmiş olabilir ve üzerinde bir sorgu yaptığınızda, tam olarak ne çıkacaksınız. XKCD bunu da esprili olarak açıklıyor.

enter image description here

+0

Teşekkürler. Neden bu kadar savunmasız olduğu konusunda biraz genişleyebilir misiniz? – Sheldon

+1

Açık, ancak güvenli olmak için açık olabilir: Sadece INSERT değil, TÜM ifadeler için bunu yapın. Bir SELECT ifadesi aynı derecede hassastır. –

+0

@PearsonArtPhoto "TypeError: işlev en fazla 2 bağımsız değişkeni (3 verilen) alır" – Sheldon