簡體   English   中英

此查詢是否可以進行SQL注入?

[英]Is SQL injection possible with this query?

UPDATE `company` SET `itnumber` = '595959' WHERE (id = 932) 

因此,itnumber的值來自該公司的用戶輸入。 我想確保我能夠阻止任何類型的SQL注入。 因此,用戶輸入595959,我在動態查詢中將該值構建為“ 595959”。 在此查詢中是否仍有可能進行sql注入攻擊? 我知道可以使用prepare語句來防止sql注入,但是prepare語句可能需要為我的應用程序進行大量開發工作,因此我正在尋找更省時,更輕松的方法來修復大多數可能注入的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());

如果您只是將輸入串聯到SQL字符串中而不進行任何清理(並且僅用單引號'將其括起來不會使其變得干凈),那么是的,它容易受到SQL注入的攻擊。

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


更新:

由於您正在使用Oracle SQL庫中的getSQLvalue() ,因此可以確保傳入的值正確地轉義。 這對於SQL注入確實是安全的,但是它要求您記住在每個地方都使用它。 但是,使用參數可以確保相同,而不會忘記忘記轉義SQL值。

是的。 例如:

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

可能會工作。

我知道可以使用prepare語句來防止sql注入,但是prepare語句可能需要為我的應用程序進行大量開發工作,因此我正在尋找更省時,更輕松的方法來修復大多數可能注入的sql語句。

您將驚訝於從一開始就以right方式實施解決方案所花費的時間要少得多。 再加上為什么這比連接查詢字符串更復雜?

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

此外,它的優點是大多數現代驅動程序將緩存准備好的語句的執行計划,從而將加快其他查詢的速度。

真正最安全的做法是為此創建一個存儲的proc,然后您的數據類型至少可以為您提供一些保護。

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 

如果這樣的話; DROP TABLE公司; -'WHERE(id = 932)傳遞到@Company_Id,它將失敗,因為數據類型為未匹配項。

如果您試圖確定要更新的列,並且僅當它們已更改時,則可以考慮使用MERGE而不是UPDATE語句。 這樣,您可以提取記錄的當前狀態,並僅在它們不相同時才更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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