2008-11-15 52 views
10

我正在使用C#和.NET 3.5。我需要生成並存儲稍後將在遠程服務器上執行的一些T-SQL插入語句。創建安全的SQL語句作爲字符串

例如,我公司員工的數組:

new Employee[] 
{ 
    new Employee { ID = 5, Name = "Frank Grimes" }, 
    new Employee { ID = 6, Name = "Tim O'Reilly" } 
} 

,我需要用一個字符串數組來結束,這樣的:

"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')", 
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')" 

我在看一些代碼它使用String.Format創建插入語句,但這並不合適。我考慮過使用SqlCommand(希望做到something like this),但它沒有提供將命令文本與參數組合的方法。

只需要替換單引號並構建字符串就足夠了嗎?

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')", 
    employee.ID, 
    replaceQuotes(employee.Name) 
    ); 

這樣做的時候應該關注什麼?源數據相當安全,但我不想做太多假設。

編輯:只是想指出,在這種情況下,我沒有SqlConnection或任何方式直接連接到SQL Server。這個特殊的應用程序需要生成sql語句並將它們排隊以便在其他地方執行 - 否則我會使用SqlCommand.Parameters.AddWithValue()

+0

AddWithValue是偉大的(我經常使用它),但它可以遭受錯誤的隱式類型轉換,如果不謹慎使用。 – 2008-11-16 00:30:44

回答

6

使用參數化命令。將參數傳遞給遠程服務器,並將其調用到SQL Server中,同時保持SQL本身和參數值之間的區別。

只要你從不混合治療數據作爲代碼,你應該沒問題。

+0

現在就去睡覺吧。明天早上10.30-11.30講道,所以你保證在鞭子上有一個很好的裂縫! ;) – 2008-11-16 00:21:27

+0

講道?有錄音嗎? – tofutim 2014-01-30 21:58:44

+0

@tofutim:不是我所知道的。 – 2014-01-30 21:59:14

17

創建您的SqlCommand對象,像這樣:

SqlCommand cmd = new SqlCommand(
     "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn); 

SqlParameter param = new SqlParameter(); 
param.ParameterName = "@id"; 
param.Value   = employee.ID; 

cmd.Parameters.Add(param); 

param = new SqlParameter(); 
param.ParameterName = "@name"; 
param.Value   = employee.Name; 

cmd.Parameters.Add(param); 

cmd.ExecuteNonQuery(); 
0

爲了避免注射,則需要將數據發送給遠程服務器(可能是XML),然後在遠程服務器上,數據應該被轉換回到適當的數據類型並用於參數化查詢或存儲過程。

1

嗯我同意其他人,你應該使用參數化查詢,將離開它。但你如何將這些sql語句傳遞給遠程服務器?你是否有一些類似Web服務的服務可以接受和執行任意的Sql命令,或者你的客戶端應用程序是否會直接訪問數據庫?

如果您經歷某種代理,那麼無論您在客戶端上清理了多少數據,黑客都可能會繞過您的應用並擊中該服務。在這種情況下,請執行Cade建議的操作,並將數據作爲XML傳遞,例如您選擇的任何格式(JSON,Binary等等)。然後在實際運行命令之前構建SQL。

4

解決您的替換報價的功能是這樣的:

void string replaceQuotes(string value) { 
    string tmp = value; 
    tmp = tmp.Replace("'", "''"); 
    return tmp; 
} 

乾杯!