2013-11-01 18 views
0

我想在c#中創建一個可重用的MySQL數據庫類,但我擔心它保持安全(可能的業務用途)。 我已經做了大量的閱讀,並且人們推薦使用參數將數據添加到表中並獲取它等。我的問題是通過多個不同的表保持類可重用 我的插入方法當前(在數據庫類中):C#MySQL可重用類安全問題

public void Insert(string incomingQuery) //Insert Statement 
{ 
    //Assign the incomingQuery for use. 
    string query = incomingQuery; 

    //Open Database Connection 
    if(this.OpenConnection() == true) 
    { 
     //Create command and assign the query and connection from the constructor 
     MySqlCommand command = new MySqlCommand(query, connection); 

     //Execute the command 
     command.ExecuteNonQuery(); 

     //Close the connection 
     this.CloseConnection(); 
    } 

} 

而且我Create方法從另一個類(Users)傳遞中的SQL查詢:

public void Create() 
{ 
    //Add a new user to the database 
    string sqlQuery = "INSERT INTO Users(first_name, last_name, pc_username) VALUES('" + firstName + "','" + lastName + "','" + userName + "');"; 
    database.Insert(sqlQuery); 
    Login(); 
} 

我怎樣才能讓這個更安全?

回答

2

如何讓這更安全?

Use parameters。您當前的查詢容易受到SQL Injection的影響。

此外,您的方法似乎還有一個開放的連接,它儘可能晚地打開數據庫連接,然後儘可能早地關閉它。在您的連接中使用using聲明並在您的方法中打開它,因爲連接和命令實現了IDisposable接口,它將確保其處理(關閉連接)。

+0

嗨,哈比。你能否提供一個代碼示例,我知道我需要使用參數,但是我所做的所有嘗試都要花費我對類的可重用需求,因爲需要將精確字段硬編碼到它中。 –

+0

@MarkTallentire,您仍然可以使用您擁有的類,您應該修改它以便在方法中打開連接。請參閱:http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples -mysqlcommand.html#connector-net-examples-mysqlcommand-parameters參數 – Habib

1

在你的MySQL數據庫中使用存儲過程,然後用他們所需的參數調用這些過程。寫下您的實用方法,以便他們採取鍵值對的字典,並解析這些進入的OdbcCommand的參數屬性

Call a stored procedure with parameter in c#

foreach(KeyValuePar kvp in dictionary) 
{ 
    command.Parameters.Add(kvp.Key).Value = kvp.Value; 
} 

我忘記了精確的代碼...

0

將所有參數(名字,姓氏等)作爲字符串[](或更好的字典)傳遞給類似於以下的方法:

AddParamsToCommand(SqlCommand cmd, Dictionary<string,string> paramList) 
{ 
    foreach (string s in paramList.Keys) 
    { 
     sqlParameter p = cmd.CreateParameter(); 
     p.Name = s; 
     p.Value = paramList[s]; 
     cmd.Parameters.Add(p); 
    } 
} 

只是一個例子。

因爲我一直在使用OleDB編輯並忘記了將參數名放在SqlCommands中。

+0

等等......你的參數是否與它的值相同,你需要兩個參數,分別爲 –

+0

是的。你可以/可以這樣做,如果你通過很多價值。最近我一直在使用OleDB,其中params不能有名字。 – TJennings