一尘不染

C#和MySQL .NET连接器-有什么方法可以防止泛型类中的SQL注入攻击?

mysql

我的想法是通过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();
   }
}

然后,我可以从程序的任何位置通过传递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();
   }}

阅读 389

收藏
2020-05-17

共1个答案

一尘不染

您绝对应该使用参数化查询来确保自己的安全。

不过,您不必每次都手动创建参数化查询。您可以修改提供的通用方法以接受的集合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();
    }
}

我还应该提到,在使用完连接后(通常在一个using块中进行处理,但是在代码示例中看不到这一详细程度),您应该非常小心地清理连接。

2020-05-17