2012-10-11 19 views
6

olarak Sorgu parametreleri onlar SQL enjeksiyonu gelen karakterlidir öyle ki, adlandırılmış sözlük olarak MySQLdb ait cursor.execute() yöntemine sorgu parametrelerini geçmek istiyorum. http://mysql-python.sourceforge.net/MySQLdb.html diyorPython MySQLdb: adlandırılmış sözlüğe

>>>c.execute('select id from users where username=%(user)s', {'user':'bob',}) 
KeyError: 'user' 

MySQLdb manuel: arayüzü tarafından beklenen biçimlendirmeyi parametre işaretçisi türünü belirten

* PARAMSTYLE

dize sabiti Bu KeyError verir neden

açıklayabilir. 'Format' = ANSI C printf biçim kodları, ör. '... NEREDE =% s'. Eğer connect.execute() için bir eşleme nesnesi kullanılırsa, arayüz aslında 'pyformat' = Python genişletilmiş format kodlarını kullanır, örn. '... WHERE adı =% (isim) s'. Ancak, API halen PARAMSTYLE birden fazla stil belirtilmesine izin vermez * belgelerinde çizgi sorunuza cevap verebilir yapıştırılan neyi aşağıdaki

cevap

6

.

Parameter placeholders can only be used to insert column values. They can not be used for other parts of SQL, such as table names, statements, etc.

+0

*** sütun değeri ekliyorum ***. Belgedeki satır aşağıdaki kodun yasa dışı olduğu anlamına gelir: 'c.execute ('% s konumundan kullanıcı adı =% s' seçin, ('users', 'bob')) – mercador

+1

@mercador Right, the '% s' parçasından, tablo adını parametrelemeye çalıştığınız için hataya neden olan şey budur. "Execute" işlevini bu şekilde kullanmanın yararı, SQL enjeksiyonunu önlemeye yardımcı olmasıdır, ancak uygun güvenlik önlemlerini alırsanız (bu konuda uzman değilim, ancak parametrelerin doğru bir şekilde sterilizasyonunu/sızmasını gerektirir) Sorguyu oluşturmak için Python'un dize biçimlendirmesini kullanır ve daha sonra 'execute' öğesine iletir. Yine, SQL enjeksiyonu ana endişe. Bu yardımcı olur umarım! – RocketDonkey

5

MySQLdb sorgu parametreleri olarak dicts verir . This response, bunu yapmak için tüm farklı yolları gösterir. Sadece "execute" için ikinci parametre olarak bu parametre (tuple, dict ...) olarak bir secuence sağlamanız gerekir. Sorgunuzu "yürütme" yönteminde yalnızca bir parametre olarak biçimlendirmeyin veya SQL injection saldırılarına maruz kalacaksınız. Bkz: gerekli denetimi ele MySQLdb kütüphanesi sağlar gibi diğer yolu sabitlenir

user = "peter;DROP TABLE users" :_(

: eğer

"SELECT * FROM users WHERE username = '%s'" % (user) 

ne olacağını düşünün.

# Connect to db 
# Open a cursor 
stmt = "SELECT * FROM users WHERE username = %(user)s" 
cursor.execute(stmt, {"user": "bob"}) 
user = cursor.fetchone() 
print user 

{'username': 'bob', 'alias': 'bobby', 'avatar': 'default', 'fullname': 'bob'} 

bize daha fazla bilgi verebilir:

Ben senin sorgu benim için çalışıyor, çünkü yanlış olduğunu bilmiyor musunuz?