2013-10-03 41 views
0

是否sqlCommand.Parameters.Add(sqlParam)檢查保留字如'Table','Drop'等 基本上我想通過使用上面的方法知道我們如何避免Sql注入什麼是機制在那裏。Parameters.Add和Sql注入

回答

2

這一切都取決於你計劃在您正在執行的SQL參數做什麼。關於使用.Parameters.Add()的好處是,這些值是單獨傳遞的,而不是大塊chunk-o-sql的一部分。當然,這取決於你決定如何處理它們。

假設你做這樣的事情:

SELECT * FROM myTable WHERE customer_nr = @customer_nr 

然後,它並沒有真正即使在「黑客」通過沿';DROP TABLE myTable --線的東西沒關係。因爲沒有客戶被命名爲`查詢根本不會返回任何「; DROP TABLE mytable的 - 」

但是,如果你要使用它像這樣:

SELECT @sql = 'SELECT * FROM myTable WHERE customer_nr = ''' + @customer_nr + '''' 
EXEC (@sql) 

那麼你打敗目的的系統和黑客將能夠做一些SQL-Injection-ISH的東西。

+1

你真的應該閱讀相關文章[關於Bobby Tables](http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-工作?rq = 1),它解釋得更好,並引用了很多其他相關信息。 – deroby

+0

所以這意味着.Parameters.Add()將避免SQL注入,我們不想去總是解決它的Sps? – aads

+0

Parameters.Add()確實可以幫助您避免SQL注入。無論你直接在.CommandText中執行實際的SQL命令,還是通過存儲過程執行實際上並不重要(儘管我更喜歡存儲過程!)。簡單地說,不要陷入將參數轉換回動態SQL的陷阱,無論是在.CommandText還是在存儲過程中,就像我上面所說的那樣。 – deroby

0

不,它不會將參數視爲保留字。使用參數化存儲過程是避免sql注入的最好方法。

+0

感謝您的回覆,請提供給我在那裏指出佔位符不會幫助防止SQL注入參考 – aads

+0

哦......我相信我能拿出一個參數化存儲過程,很容易受到SQL注入攻擊。 :) –