簡體   English   中英

這個Python代碼是否容易受到SQL注入攻擊? (sqlite3的)

[英]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命令中,因為它確保使數據庫安全。 使用第一個命令,制作一個特殊的tableargs可以相對容易地將一些東西放入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM