2014-07-03 26 views
-1

我試圖通過參數保護下面的SQL查詢,但我沒有得到相同的功能。在ASP.NET中的以下查詢中刪除SQL注入?

原始SQL查詢:

SqlDataSource1.SelectCommand = "SELECT ASP_USER.TRANS_MASTER_EMEAPAY.* FROM ASP_USER.TRANS_MASTER_EMEAPAY where " + cond; 

使用參數後,

String strQuery=SELECT ASP_USER.TRANS_MASTER_EMEAPAY.* FROM ASP_USER.TRANS_MASTER_EMEAPAY where @cond; 
SqlCommand cmd = new SqlCommand(strQuery); 
cmd.Parameters.AddWithValue(@cond, cond); 
//blabla... 

我們通過函數調用得到的cond值。

任何人都可以建議如何刪除此類查詢中的SQL注入?
是否有任何其他方式來保護這種類型的查詢?

COND定義爲: COND =條件() 和條件()被定義爲如下: 我們使用COND如下:cond=Condition();和條件函數定義如下:公共字符串條件()

{ 
    string condStr = " 1 = 1"; 

    if (ddlCountry.SelectedValue != "" && ddlCountry.SelectedValue != "0") 
    { 

     condStr = condStr + " AND [Country] = '" + ddlCountry.SelectedValue + "'"; 
    } 

    if (txtBatch.Text != "") 
    { 

     condStr = condStr + " AND [BATCH] = '" + txtBatch.Text + "'"; 
    } 

    if (txtpid.Text != "") 
    { 

     condStr = condStr + " AND [PARTNER_PRO_ID] = '" + txtpid.Text + "'"; 
    } 

    return condStr; 


} 
+0

cond是什麼?你的完整的sql查詢看起來如何?如何讓'cond'工作的功能? – rene

+4

_「我們正在通過函數調用獲取cond的值」_不要用不同的方法連接你的sql。這是你的sql注入問題的根源。 –

+1

您必須使鍵/值對的函數返回列表各自爲字段名稱和值,然後將它們各自添加爲參數。 –

回答

2

我想你想達到某事像這樣:

var cond = "A = 'A' AND B LIKE 'C'"; 
SqlDataSource1.SelectCommand = "SELECT ASP_USER.TRANS_MASTER_EMEAPAY.* FROM ASP_USER.TRANS_MASTER_EMEAPAY where " + cond; 

這是錯誤的方法。你應該建立這樣的事情:

SqlDataSource1.SelectCommand = "SELECT ASP_USER.TRANS_MASTER_EMEAPAY.* FROM ASP_USER.TRANS_MASTER_EMEAPAY where A = @aCond AND B LIKE @cCond;"; 
SqlCommand cmd = new SqlCommand(strQuery); 
cmd.Parameters.AddWithValue("aCond", "A"); 
cmd.Parameters.AddWithValue("cCond ", "C"); 

它不會遭受SQL注入。

如果要在條件中使用變量amount,則應該使用佔位符通過字符串構建器構建查詢,然後使用參數。防爆

var values = new Dictionary<string, string> { { "A", "B"}, { "A", "C"} }; 

var lastParam = 0; 

var builder = new StringBuilder("SELECT ASP_USER.TRANS_MASTER_EMEAPAY.* FROM ASP_USER.TRANS_MASTER_EMEAPAY where "); 

var sqlBld = new SqlCommandBuilder(); 

foreach (var pair in values) 
{ 
    lastParam += 1; 
    var column = sqlBld.Quote(pair.Key); // if column name is const, you can skip quote 
    builder.AppendFormat("{0} = @{1} ", sqlBld, lastParam); // REMEMBER for including OR or AND after clasule. 

    cmd.Parameters.AddWithValue(lastParam.ToString(), pair.Value); 
} 

殘月:代碼已經從內存中寫的,所以它可以包含錯誤:)

當然,你不必使用詞典 - 你可以建立自己的結構 - 例如 - 運營商。

+0

我已經更新了主代碼,你可以看到我如何在** cond = Condition()中定義** Condition()**函數; ** –

+1

嗯,我認爲我的解決方案對您來說仍然是sutibale。讓Condition()返回'IDicitionar ',其中key是列名。然後像上面一樣構建查詢(使用查詢構建器和參數)。 –

+0

你能爲我提供任何解決方案嗎?其實,我沒有得到你在** for循環中做什麼,以及如何在我的項目中實現你的解決方案。請幫助。 –