[英]Is this Python code vulnerable to SQL injection? (SQLite3)
正如標題所示,我想知道這段代碼是否容易受到SQL注入攻擊? 如果是這樣,是否有更好,更安全的方式來實現同樣的目標?
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
是的。 使用這樣的東西來防止它:
cursor.execute("INSERT INTO table VALUES ?", args)
請注意,您不能像這樣輸入表格。 理想情況下,表格應該是硬編碼的,在任何情況下都不應該來自任何類型的用戶輸入。 您可以使用類似於您對表所做的字符串,但您最好100%確定用戶無法以某種方式更改它...請參閱我可以在sqlite3中使用參數作為表名嗎? 更多細節。
實際上,您希望將參數放在cursor命令中,因為它確保使數據庫安全。 使用第一個命令,制作一個特殊的table
或args
可以相對容易地將一些東西放入SQL代碼中並且不安全。 請參閱python頁面和引用的http://xkcd.com/327/ 。 具體來說,python頁面引用:
通常,您的SQL操作需要使用Python變量中的值。 你不應該使用Python的字符串操作來組裝你的查詢,因為這樣做是不安全的; 它使您的程序容易受到SQL注入攻擊(請參閱http://xkcd.com/327/以獲取可能出錯的幽默示例)。
而是使用DB-API的參數替換。 放? 作為占位符,無論您想要使用哪個值,然后提供一個值元組作為游標的execute()方法的第二個參數。 (其他數據庫模塊可能使用不同的占位符,例如%s或:1。)
基本上,有人可以設置執行另一個命令的args,如下所示:
args="name; DELETE table"
使用cursor.execute將填充給定的值,以便參數可以列出,當您對其進行查詢時,這正是您將要獲得的。 XKCD也幽默地解釋了這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.