2013-02-25 21 views
-1

我有這樣的語句:SQL注入,如果被過濾括號和分號

SELECT * FROM TABLE WHERE COLUMN = 123456 

123456是由用戶提供的,因此很容易受到SQLI但如果我去除所有分號和括號,是有可能黑客運行任何其他語句(如DROP,UPDATE,INSERT等),除了SELECT

我已經在使用準備好的語句,但我很好奇,如果輸入被剝離了行結束符和括號,黑客可以以任何方式修改數據庫嗎?

+3

爲什麼要經歷這種擔心?只需使用預準備語句,存儲過程或您使用的平臺提供的任何機制。 SQL注入是**解決**問題。不要爲自己做工作和壓力。 – 2013-02-25 15:18:40

+0

在MSDN上有一個很好的網頁:http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx – Deruijter 2013-02-25 15:20:59

+1

分號不是必需的語句分隔符。如果他們提供'123456 UPDATE FOO SET Bar = 12',那將起作用。 – 2013-02-25 15:21:04

回答

7

使用sql參數。試圖「消毒」輸入是一個不好的想法。試着用谷歌搜索一些複雜的SQL注入片段,你不會相信創造性的黑帽黑客是如何。

+1

你能舉個例子嗎? – Elmo 2013-02-25 15:18:34

1

一般來說,通過試圖去除特定字符來100%確定自己不會受到這種類型的攻擊是非常困難的 - 有太多方法可以繞過代碼(通過使用字符編碼等)

更好的選擇是將參數傳遞給存儲過程,就像這樣:

CREATE PROCEDURE usp_MyStoredProcedure 
    @MyParam int 
AS 

BEGIN 
    SELECT * FROM TABLE WHERE COLUMN = @MyParam 

END 
GO 

這樣SQL會把傳過來的參數值,而不是其他,不管它包含什麼。而在這種情況下,它只會接受int類型的值。

如果你不想或不能使用存儲過程,那麼我建議改變你的代碼,以便輸入參數只能包含預定義的字符列表 - 在這種情況下,數字字符。這樣,您可以確定該值可以安全使用。

+1

您不必使用存儲的特效,只能使用參數化查詢。 – 2013-02-25 15:30:59

+0

我想這是真的,但如果輸入來自用戶,那麼我認爲他正在創建一個動態的sql語句,然後將它傳遞給SQL服務器來執行,在這種情況下,存儲過程將是(至少對我而言)更好的選擇。 – paulH 2013-02-25 15:36:26