2012-04-09 25 views
6

我正在研究一個需要我以編程方式從django應用程序創建MySQL用戶的項目。我可以創建用戶就好了:防止MySQL-Python圍繞數據庫名稱參數插入引號

from django.db import connection, transaction 
cursor = connection.cursor() 
cursor.execute("CREATE USER %[email protected]'%'", 'username') 
cursor.execute("SET PASSWORD FOR %[email protected]'%' = PASSWORD(%s)", ('username', 'pass')) 

完美地工作。問題是當我嘗試授予權限時。數據庫名稱也編程方式確定:

cursor.execute("GRANT SELECT ON %s.* TO %[email protected]'%'", ('dbname', 'username')) 

這導致MySQL錯誤,因爲當它的字符串替換,它把周圍的數據庫名稱,這在語法上是不正確的單引號:

DatabaseError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dbname'.* to 'username'@'%'' at line 1")

如何防止在%s的數據庫名稱周圍添加單引號?我知道我可以簡單地在Python中進行字符串替換並修復此問題,但這可能會導致SQL注入漏洞。

+1

看起來可能不可能。根據mysql-python文檔:_Parameter佔位符只能用於插入列值。它們不能用於SQL的其他部分,例如表名,語句等.​​_ – dgel 2012-04-09 17:26:57

回答

6

有時佔位符將無法工作(因爲你已經發現),所以你將不得不使用字符串連接。小心 - 驗證字符串,確保它只包含您期望的字符(不要只查找不期望的字符),並且您應該沒問題。還請另一位開發人員檢查您的代碼,並對其進行評論以確保沒有人認爲您應該使用佔位符。

+0

很好的建議。謝謝。 – dgel 2012-04-09 21:38:03