2012-11-28 72 views
9

正如標題所暗示的,我想知道,如果這個代碼是容易受到SQL注入?如果是這樣,是否有更好,更安全的方式來實現同樣的目標?這個Python代碼容易受到SQL注入的影響嗎? (sqlite3的)

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

我建議你閱讀SQL注入是什麼。它應該說得很清楚。 –

回答

21

是的。使用類似的東西來防止它:

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

請注意,您不能像這樣輸入表格。理想情況下,表格應該是硬編碼的,在任何情況下都不應該來自任何類型的用戶輸入。您可以使用類似於你做了什麼對錶中的字符串,但你最好100%肯定的是,用戶不能以某種方式改變它...詳情請參閱Can I use parameters for the table name in sqlite3?

本質上講,你想放的參數在光標的命令,因爲這將確保使數據安全數據庫。有了您的第一個命令,這將是比較容易作出這樣的東西放在你的SQL代碼,這不是安全的一種特殊tableargs。請參閱python pages和參考http://xkcd.com/327/。具體來說,蟒蛇頁面引用:

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

基本上,有人可以設置執行其他命令的指定參數時,這樣的事情:

args="name; DELETE table" 

使用cursor.execute將東西給定的值,從而使參數可以如列出的那樣,並且當你對它進行查詢時,這就是你將要得到的結果。 XKCD也很好地解釋了這一點。

enter image description here

+0

謝謝。你可以擴大一點,爲什麼它是脆弱的? – Sheldon

+1

它可能很安靜,但爲了安全起見:對所有語句執行此操作,而不僅僅是INSERT操作。 SELECT語句同樣易受攻擊。 –

+0

@PearsonArtPhoto我得到「類型錯誤:函數至少需要(3給出)最多2個自變量」 – Sheldon

相關問題