2013-05-13 72 views
0

如果我允許用​​戶鍵入文本框,然後對我的數據庫執行搜索,則可能會發生sql注入。我可以使用正則表達式,這是我的第一個想法。但我有一個更好的主意。爲什麼不看他們輸入的是否有任何SQL關鍵字。我使用SQL Server數據庫,在ASP.NET程序中使用C#,我認爲微軟會提供一個簡單的解決方案,我正在談論。最好我能找到的是這篇文章:檢查C#中的SQL關鍵字#

Is it a programmatic way to get SQL keywords (reserved words)

這可能是什麼病最終會做,但我的問題是,我還是得打出來的關鍵字的完整列表,有一百個左右。當然,我現在可以完成而不是搜索並詢問這個問題。但沒有一個更簡單的方法?現在我要去:

1創建一個HashSet 2中的所有關鍵字添加到HashSet的(CMON)對HashSet的 3驗證用戶輸入

很想見步驟2將變得更加容易,任何有關SQL注入的其他建議還讚賞

+3

我想補充我的兩分錢,EXCEPT,我沒有變更權利,你會採取支票?如果銀行關門,我希望能把你從哈維省存到銀行。考慮到上面的每個大寫字母都是一個SQL關鍵字,我不認爲這是一個好方法...... – Sparky 2013-05-13 02:36:11

+1

一個好的方法是編寫一個SQL存儲過程從文本框中獲取文本並執行查詢...搜索SQL注入,你會發現爲什麼創建一個黑名單的話不是一個好方法 – Sparky 2013-05-13 02:37:31

+0

... iam使用存儲過程...不需要仍然檢查你的說法嗎? – dwarf 2013-05-13 02:39:21

回答

2

如果你是路過搜索文本到一個存儲過程,做這樣的事情

WHERE search LIKE @inputParam 

SQL不允許注射承擔在上面的片段中。

但是,如果你正在建設一個字符串變量,然後使用EXEC @sql或sp_execute @SQL,你很容易受到SQL注入。

2

在我看來,你會過得更好,避免使用parameterized SQL共檢查SQL關鍵字的問題。下面是C#中的一個例子(假設您使用的是MS SQL Server):

using (SqlCommand sqlcmd = new SqlCommand("SELECT * FROM [MyDB].[dbo].[MyTable] WHERE [SomeColumn] = @SomeValue", sqlconnection)) 
{ 
    sqlcmd.Parameters.AddWithValue("@SomeValue", strUsersSearchString); 

    // use sqlcmd.ExecuteReader() here 
    // or whatever you normally would 
} 

這是MSDN上的另一個示例。這是一個使用參數化SQL調用存儲過程:命名參數http://msdn.microsoft.com/en-us/library/ff648339.aspx#paght000002_step3

0

使用。 Dapper-dot-net使得它很容易做到這一點:

IEnumerable<Row> results = connection.Query<Row>("SELECT column FROM table WHERE title LIKE @query", new { query = "SEARCHTERM" });