C#MySQL Re-Usable类安全问题

时间:2013-11-01 13:21:04

标签: c# mysql class

我试图在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 Query:

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();
}

如何让这更安全?

3 个答案:

答案 0 :(得分:2)

  

如何让这更安全?

Use parameters。您当前的查询易受SQL Injection影响。

此外,您的方法中似乎有一个开放连接,最好尽可能晚地打开数据库连接,然后尽早关闭它。对您的连接使用using语句并在您的方法中打开它,因为Connection和Command实现了IDisposable接口,它将确保它的处理(关闭连接)。

答案 1 :(得分:1)

在MySQL数据库中使用存储过程,然后使用所需参数调用这些过程。编写实用程序方法,使它们获取键值对词典,并将它们解析为OdbcCommand的Parameters属性

Call a stored procedure with parameter in c#

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

我忘了准确的代码......

答案 2 :(得分:0)

将所有参数(firstName,lastName等)作为字符串[](或更好的字典)传递给类似于以下内容的方法:

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后编辑,忘了将名字放在params for sqlCommands上。