2013-03-10 53 views
0
private void Save_rec_Click(object sender, EventArgs e) 
{ 
    string pattern = ("[\\s]+"); 
    string input = firstname.Text; 
    string replacement = "_"; 
    Regex rgx = new Regex(pattern); 
    string result = rgx.Replace(input, replacement); 
    msg.Text = result; 

    cmd = new SqlCeCommand("create table " + result + "(id int, first_name nVarChar(100))", con); 
    cmd.ExecuteNonQuery(); 
    cmd = new SqlCeCommand("insert into '"+ result +"' values(1,'" + firstname.Text + "')", con); 
    cmd.ExecuteNonQuery(); 
} 
+0

你在插入語句中有問題嗎? – Sachin 2013-03-10 18:12:07

+1

這不是一個問題。 – AndrewR 2013-03-10 18:31:07

回答

0

這是更多的評論,但有太多要解決的空間只允許評論。首先,誰是這個代碼的最終用戶?它純粹是內部的,嚴格限制?因爲你正在接觸SQL Injection攻擊。

也就是說,它看起來執行你想要的操作(創建一個表,然後在表中插入一行),你必須使用動態SQL,因爲你正在做上面的事情,要注意的是在將其包含在SQL字符串中之前,您必須清理掉firstname.Text。另外,對於insert字符串,您應該使用[]而不是''括起表名。

注意:要考慮的一件重要事情就是你要完成的事情。對於之後的任何事情,我都無法想象一個場景,其中N個用於N個名字輸入的單行表是一個好設計。

+0

我認爲他不能工作的代碼是因爲他創建了一個有2列的表格,但只能插入1列數據。也許他打算讓id成爲IDENTITY專欄?我同意你的評估。這個架構不好。 – AndrewR 2013-03-10 18:33:58

+0

@AndrewR他爲他的'id'列插入靜態1,爲他的'first_name'列插入SQL注入易受攻擊的'firstname.Text',所以他的語法沒問題。但是,語法之外還有很多問題。 – 2013-03-10 18:37:00

+0

正則表達式實際上是用一個下劃線替換多個連續的空格(空格,製表符,換行符)。使用'Replace('','_')'只會替換空格,如果一行中有多個空格,你會得到多個下劃線而不是一個下劃線。 – juharr 2013-03-10 18:48:22

0

人們無法經常這麼說,尤其是因爲它在.NET中相當簡單。 只需使用下面的SqlCommand參數即可防止SQL注入發生:

string strUserInput = TextBox1.Text; 

SqlCommand sqlComm = new SqlCommand(); 
sqlComm.CommandText = "SELECT SomeColumn FROM Table WHERE Name = @ParamName"; 
SqlParameter param = cmd.Parameters.Add("@ParamName", strUserInput); 
相關問題