正如標題所暗示的,我想知道,如果這個代碼是容易受到SQL注入?如果是這樣,是否有更好,更安全的方式來實現同樣的目標?這個Python代碼容易受到SQL注入的影響嗎? (sqlite3的)
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
正如標題所暗示的,我想知道,如果這個代碼是容易受到SQL注入?如果是這樣,是否有更好,更安全的方式來實現同樣的目標?這個Python代碼容易受到SQL注入的影響嗎? (sqlite3的)
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
是的。使用類似的東西來防止它:
cursor.execute("INSERT INTO table VALUES ?", args)
請注意,您不能像這樣輸入表格。理想情況下,表格應該是硬編碼的,在任何情況下都不應該來自任何類型的用戶輸入。您可以使用類似於你做了什麼對錶中的字符串,但你最好100%肯定的是,用戶不能以某種方式改變它...詳情請參閱Can I use parameters for the table name in sqlite3?。
本質上講,你想放的參數在光標的命令,因爲這將確保使數據安全數據庫。有了您的第一個命令,這將是比較容易作出這樣的東西放在你的SQL代碼,這不是安全的一種特殊table
或args
。請參閱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也很好地解釋了這一點。
我建議你閱讀SQL注入是什麼。它應該說得很清楚。 –