2014-03-27 58 views
0

我有一個格式化查詢的嚴重問題,它可能會導致SQL注入,我看到一些類似的qstns,但不知道我怎麼能在C#中使用它,因爲我是新來的它。我使用C#,ODBC命令動態SQL查詢形成,使用string.format

我有3個串像 qry ="select description from TableA" , qryOrder = " order by description" , qryAppend = " where ID = '{0}' order by description\", _selectedPlantID"提供_selectedId是另一個變量,現在我想用這些變量在不同的場景,形成差異查詢,例如,qry + qry order,或qry + qryAppend

由於_selectedPlantId還需要,我用的String.format爲:

_cmd.CommandText = "string.Format(\"" + qry + qryAppend + ")"; 

但它不工作。任何解決方案 錯誤是SQL引用的語法錯誤

在此先感謝!

+3

使用[參數化查詢](http://www.dotnetperls.com/sqlparameter)。 – DGibbs

+3

仔細查看_cmd.CommandText的值。你可能實際上看到了問題。 –

回答

0

簡而言之,這應該使它工作。你需要兩個變量(布爾),以後我會解釋爲什麼:

var shouldOrder = true; 
var shouldAppend = true; 

_cmd.CommandText = String.Format(
    "{0} {1} {2}", 
    qry, 
    shouldOrder ? qryOrder : String.Empty, 
    shouldAppend ? qryAppend : String.Empty 
); 

這兩個變量(shouldOrdershouldAppend)將幫助你的「在不同的場景差異查詢」如你所說。

使用true或false提供這些變量將改變文本進入String.Format的內容並相應地改變查詢。

因此,如果您使用shouldOrder = false;查詢命令將不會獲得訂單部分。設置shouldAppend = false;將避免將額外部分(追加)包括到SQL命令中。

現在,小心!

這不會解決您的SQL注入問題。我剛剛顯示了一個快速修復。

爲避免SQL注入,您必須更改您的SQL命令,並且不能再使用String.Format。

要了解如何做到這一點,請查看DGibbs評論。

+0

感謝您的詳細解答:) – drk