2011-02-28 41 views
0
UPDATE `company` SET `itnumber` = '595959' WHERE (id = 932) 

因此itnumber的值來自該公司的用戶輸入。我想確保我能夠防止任何類型的SQL注入。因此,用戶輸入595959,我在動態查詢中將該值創建爲'595959'。這個查詢中是否仍然可能存在sql注入攻擊?我知道使用準備語句來防止sql注入,但準備語句可能需要我的應用程序的很多開發工作,所以我正在尋找更少的時間和更簡單的方法來修復大部分可以注入的sql語句。此查詢是否可以進行SQL注入?

StringBuffer sb = new StringBuffer(); 
sb.append(" UPDATE "); 
sb.append(DB.quote(table)); 
sb.append(" SET "); 
/* logic if column value has changed */ 
/* if yes */ 
sb.append(DB.quote(column.name)); 
sb.append(" = "); 
sb.append(column.getSQLvalue()); 
sb.append(" WHERE (id = "); 
sb.append(columns[0].getSQLvalue()); 
sb.append(")"); 
execute(sb.toString()); 
+8

分析SQL注入是否可行需要查看生成SQL的* source *,而不是生成的SQL。 – Gabe 2011-02-28 20:31:24

+0

爲什麼'java'標籤? – 2011-02-28 20:35:52

+0

@Alexander Pogrebnyak - 猜測,SQL字符串可能是在java應用程序中構建的。 – Oded 2011-02-28 20:36:35

回答

8

如果你只是串聯輸入到一個SQL字符串沒有做任何清理工作(並簡單地用單引號'周圍沒有關係不能讓它乾淨的),然後是的,這是容易受到SQL注入。

請發佈構建此SQL的代碼以獲得明確答案。


更新:

由於您使用從Oracle SQL庫getSQLvalue(),這將確保在傳遞的值被正確轉義。這對於SQL注入來說確實很安全,但它要求您記住在每個地方都使用它。但是,使用參數可以確保相同,但不會遺漏忘記SQL值的風險。

3

是的。例如:

UPDATE `company` 
SET `itnumber` = '595959'; DROP TABLE company; --' WHERE (id = 932) 

可能會工作。

+0

我試過這個,但它存儲了595959'; DROP TABLE公司的值; - 對於'itnumber'字段。 – yogsma 2011-02-28 20:49:04

+0

這取決於您正在更新的數據庫的類型以及您在代碼中構建動態SQL字符串的方式。你有沒有可以向我們展示的例子? – 2011-02-28 20:58:14

+1

我已經添加了代碼構建查詢的方式。 – yogsma 2011-02-28 21:30:05

3

我知道使用準備語句 用來防止SQL注入,但 準備語句可能會佔用大量的 發展努力,爲我的 的應用程序,所以我期待少 耗時和更簡單的方法到 修復了大部分我的sql語句,其中 注入是可能的。

您會驚訝地發現,從一開始就實施解決方案right的方式花費多少時間。另外,這是如何比連接查詢字符串更復雜?

PreparedStatement pstmt = con.prepareStatement(
     "UPDATE `company` SET `itnumber` = ? WHERE (id = ?)" 
    ); 
pstmt.setString(1, "595959"); 
pstmt.setInt(2, 932); 

此外,它具有如下優點:最先進的驅動程序將緩存預處理語句的執行計劃,因此這將加快其他查詢。

1

真的最安全的做法是爲此創建一個存儲過程,那麼你的數據類型至少可以保護你一點。

CREATE PROC usp_Update_itnumber_by_Company_Id 

@itnumber int 
, @Company_Id int 

as 

BEGIN TRAN  
UPDATE [Company] 
SET itnumber = @itnumber 
WHERE id = @Company_Id; 

COMMIT TRAN 

這樣if if; DROP TABLE公司; - 'WHERE(id = 932)被傳入@Company_Id,它將失敗,因爲數據類型是未命中匹配。

如果你正在試圖確定要更新的列,只有當他們已經改變了,你可以看看這樣做而不是UPDATE語句MERGE。通過這種方式,您可以獲取記錄的當前狀態,只有當它們相同時才更新。

相關問題