2016-01-22 33 views
0

我有這樣的C#代碼檢索與ADO.NET從SQL Server數據庫中的數據:語法注入SQL服務器的SQL語句轉換爲C#代碼

//Define ADO.NET objects 
    string selectSQL; 
    selectSQL = "SELECT * FROM slip "; 
    selectSQL += "WHERE slip_id='" + txtSlipID_srch + "'"; 

我在書上讀到的語法,並已獲得在大學的語法,但我沒有給它一個解釋,除了「這是語法」。我談論的語法如下:

'" + txtSlipID_srch + "' 

即字段名txtSlipID_srch由一個單引號,雙引號和一個加號的約束。

有人可以幫我翻譯一下嗎?我會很感激。

+6

你應該歸還這本書並要求你的大學退款。這是從C#執行SQL代碼的一種可怕方式,因爲它會將您的應用程序打開到SQL注入,這是一個巨大的安全風險。 –

+1

大學的名字是什麼,我想把它列入我的黑名單。 :) –

+3

不要聽書 - **使用參數化查詢**! –

回答

1

誰教你了這個語法真的教會你一個錯誤的東西。
如您所猜,此語法將字符串txtSlipID_srch的內容連接到您的SQL文本,從而形成固定文本和可變部分的完整指令。整個事情然後傳遞給數據庫引擎執行。

但允許用戶輸入文本框的東西,然後使用該輸入來建立SQL查詢確實是一個錯誤的事情

,用戶可以輸入任何東西,任何東西也可能是一個很好僞造的字符串改變您的意圖並破壞您的數據庫或獲取您不希望他看到的信息(密碼或信用卡號碼)。它被稱爲Sql Injection,並且有數以千計的關於如何實現這種黑客技術的文章。我不想重複任何事情,你可以簡單地看看這個well known comics+question+answers並閱讀下面的解釋

除此之外。存在正確解析字符串的問題。在您的字符串變量中出現單引號可能會導致您的查詢無效,因爲單引號用於分隔傳遞給數據庫的字符串值。使用轉換過程的小數和日期應該在字符串中進行轉換。同樣在這裏,您應該爲數據庫創建正確的文本(它是否像逗號或小數點?,日期格式爲'dd/MM/yyyy'或'MM/dd/yyyy'或什麼?等等)

唯一有效的方法是使用你寫你的命令文本以這種方式參數化查詢

selectSQL = "SELECT * FROM slip WHERE [email protected]"; 

現在沒有更多的兩個字符串和字符串值的兩邊沒有單引號'的串聯轉義「他們,但只是一個名爲@id的參數佔位符。

ADO.NET庫將提供相應的類來處理該參數,並將該值傳遞給數據庫引擎,以便在該數據庫引擎中進行正確處理。

SqlCommand cmd = new SqlCommand(selectSQL, connection); 
cmd.Parameters.Add("@id", SqlDbType.NVarChar).Value = txtSlipID_srch; 
SqlDataReader reader = cmd.ExecuteReader(); 
...... 
+0

非常感謝大家....我現在正在通過你的答案。乾杯。 – Trevor

0

因爲你想要得到的SQL看起來像這樣:

SELECT * FROM slip WHERE slip_id='somevalue' 

它需要在產生的SQL語句中的單引號。

雙引號是定義C#代碼中的字符串。 單引號是定義SQL語句中的字符串。

0

使用單引號的原因是因爲SQL期望字符串值被括在單引號中。 (如在其他答案解釋)

不要使用字符串連接創建SQL查詢。您的輸入可能來自用戶,任何惡意用戶都可以利用它。閱讀關於SQL Injection

你可以做,以更好的方式:

使用參數

using (SqlConnection conn = new SqlConnection("connection string")) 
using (SqlCommand cmd = new SqlCommand("SELECT * FROM slip WHERE [email protected]", conn)) 
{ 
    cmd.Parameters.AddWithValue("@slipID", txtSlipID_srch);//Even use .Add and specify data type 
    //open connection 
    //execute command 
} 

using statement命令執行後處置掉的資源。

(另外,如果你的書沒有提及使用parameters後,那麼你沒有關閉這本書,從別的地方讀好)在這種情況下

0

的+是連接運算符。在示例中,txtSlipID_srch是一個包含值的變量,並將該值連接到另一個字符串(即,您的SQL語句)。就像我想說你好馬爾滕你今天好嗎?我會寫string greeting = "Hello " + yourNameVariable + " how are you today?";。所以,當Maarten存儲在yourNameVariable中時,它會獲取這些信息並將它與其他兩個字符串連接起來。請注意,我還必須包含空格以確保字符串正確顯示?但正如每個人都指出的那樣,在構建sql語句(它們本身就是字符串)時,絕不應該使用它,因爲這會讓用戶能夠傳入一個字符串,以便讓它們對數據庫執行更多的破壞性語句。