C#和MySQL .NET Connector - 在通用类中防止SQL注入攻击的任何方法?

Joh*_*n M 9 .net c# mysql mysql-connector mysql-parameter

我的想法是通过C#(3.5)Winforms应用程序通过MySQL .NET Connector 6.2.2与MySQL数据库交谈,为Insert/Update/Select创建一些通用类.

例如:

public void Insert(string strSQL)
{
   if (this.OpenConnection() == true)
   {
       MySqlCommand cmd = new MySqlCommand(strSQL, connection);
       cmd.ExecuteNonQuery();
       this.CloseConnection();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,从程序的任何地方我都可以通过传递SQL查询字符串来运行带/不带用户输入的查询.

在SO上阅读开始告诉我这可能导致SQL注入攻击(对于任何用户输入值).无论如何擦除输入的strSQL还是我需要在每个需要执行数据库功能的方法中创建单独的参数化查询?

UPDATE1:

我的最终解决方案看起来像这样:

public void Insert(string strSQL,string[,] parameterValue)
{
   if (this.OpenConnection() == true)
   {
       MySqlCommand cmd = new MySqlCommand(strSQL, connection);

       for(int i =0;i< (parameterValue.Length / 2);i++)
       {                        
       cmd.Parameters.AddWithValue(parameterValue[i,0],parameterValue[i,1]);          
       }

       cmd.ExecuteNonQuery();
       this.CloseConnection();
   }}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 11

你绝对应该使用参数化查询来保证自己的安全.

您不必每次都手动创建参数化查询.您可以修改您提供的通用方法以接受以下集合MySqlParameters:

public void Insert(string strSQL, List<MySqlParameter> params)
{
    if(this.OpenConnection() == true)
    {
        MySqlCommand cmd = new MySqlCommand(strSQL, connection)
        foreach(MySqlParameter param in params)
            cmd.Parameters.Add(param);

        cmd.ExecuteNonQuery();
        this.CloseConnection();
    }
}
Run Code Online (Sandbox Code Playgroud)

我还应该提一下,在你完成使用它们之后,你应该非常小心清理你的连接(通常在一个using块中处理,但我没有在你的代码示例中看到这种详细程度).


Tho*_*rin 11

参数化很容易做到.比擦除SQL查询容易得多,并且比手动转义更简单或更容易出错.

本教程页面略微编辑复制/粘贴,因为我感觉很懒:

// User input here
Console.WriteLine("Enter a continent e.g. 'North America', 'Europe': ");
string userInput = Console.ReadLine();

string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent";
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Continent", userInput);

using (MySqlDataReader dr = cmd.ExecuteReader())
{
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

那不是那么难,是吗?:)