2011-05-05 101 views
1

我保持一段代碼,串接SQL查詢:和addslashes /逃避單引號在.NET

string sql = "SELECT* FROM table WHERE column = '" + value + "'"; 

現在事實證明,如果包含 characted它會破壞SQL服務器文本語句。我搜索了一下類似PHP addslashes的方法,但沒有成功。有Regex.Escape但它並沒有伎倆。是否有任何其他的方式來解決這個問題,除了呼籲上串?:

string sql = "SELECT* FROM table WHERE column = '" + value.Replace("'", "''") + "'"; 

由於更換方法, 帕維爾

+4

你絕對_have_來連接?你不能使用參數嗎? – 2011-05-05 14:28:11

+1

需要做大量重構...... – dragonfly 2011-05-05 14:28:38

+2

在我們開始編碼時,爲什麼我們需要一個「首先沒有危害」的誓言類型?這種*重構*將極大地幫助您在將來。現在花這些週期來殺死這些技術債務。 – 2011-05-05 14:34:16

回答

3

我會建議不要使用,你應該使用的參數字符串連接,而不是看下面的例子

// 1. declare command object with parameter 
SqlCommand cmd = new SqlCommand(
    "select * from Customers where city = @City", conn); 
// 2. define parameters used in command object 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@City"; 
param.Value   = inputCity; 
// 3. add new parameter to command object 
cmd.Parameters.Add(param); 
8

您應該使用SqlCommandSqlParameter而不是構建查詢,你現在是。正如其他人所說,你正在做的事情讓你對注入攻擊敞開大門。

如果你不能這麼做,那麼正如你所說,替換是一個很好的選擇。

3

您正在打開您的代碼到SQL Injection攻擊 - 使用參數化查詢。

作爲一種獎勵,這種逃避罪惡將不再需要,因爲圖書館會爲你照顧它們。

1

而這是通常推薦使用SQL參數的一個關鍵原因。如果這不是一個選項,我認爲String.Replace()是一樣好的任何其他方法。