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

我的想法是通过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还是我需要在每个需要执行数据库function的方法中创建单独的参数化查询?

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

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

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

 public void Insert(string strSQL, List 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块中处理,但我在代码示例中没有看到详细程度)。

参数化非常容易。 比擦除SQL查询容易得多,并且比手动转义更简单或更容易出错。

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

 // User input here Console.WriteLine("Enter a continent eg '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. } 

那不是那么难,是吗? 🙂

事实之后检测SQL注入是不可能的(换句话说,一旦构造了动态查询字符串,就无法区分“真正的”SQL与任何注入的SQL之间的区别)。

如果你的意图是允许用户执行任意SQL,那么你似乎不会太担心SQL注入(因为这是SQL注入的目的 )。

我希望擦除将用于SQL的原始文本非常困难。 如果可能的话,我会尝试使用参数化操作。

一个例外是如果您没有公开公开该函数,并且您从未传入从原始用户输入构造的字符串。

如果您使用MySqlParameter并且不生成纯字符串查询,那么您是安全的。

你不能真的这样做 – 你需要编写一个SQL解析器,至少可以说是非平凡且容易出错。

咬紧牙关并对您的查询进行参数化。

我建议使用IDataParameter对象来参数化您的查询。

是的,你需要创建参数化查询,其他任何东西都会引入SQL注入的风险