将查询作为参数传递

问题描述:

我知道,不推荐。 SQL注入的可能风险。将查询作为参数传递

在我目前的应用程序中,我创建了一个包含可重用函数的类。一个这样的功能是:

public static Int32 InsertNewRecord(string myQuery) 
{ 
    ModCon.OpenConnection(); 
    MySqlCommand cmdInsert = new MySqlCommand(myQuery, ModCon.myCN); 
    try 
    { 
     Int32 RecordsAffected = cmdInsert.ExecuteNonQuery(); 
     return RecordsAffected; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return 0; 
    } 
    finally 
    { 
     cmdInsert.Dispose(); 
     ModCon.CloseConnection(); 
    }    
} 

这个类有很多这样的方法可以重用。有一种方法来填充一个DataGridView,我通过DataGridView名称和SQL查询来填充它。

我的应用程序目前是一个独立的Windows应用程序。什么可能是专业的方式来实现这一点,而不用担心SQL注入?

上面的方法在一个类中,每当我需要这些方法时,我都会在另一个类中创建这个类的一个实例。

+0

是否在myQuery中传递了通过查询字符串传入的内容? – Oded 2010-10-30 17:56:24

+0

是的。但请记住,目前它不是一个Web应用程序。 – RKh 2010-10-30 18:00:04

你要么两个选择:

  1. 您可以创建您的查询的描述。您可以通过使用表名创建InsertQuery类来完成此操作。有了这个,你可以添加过滤器,例如,创建一个类EqualFilter,然后你可以用AndFilter组成一个类来得到两个相等的比较结果;

  2. 如果你认为这是很多工作,它是。另一种方法是使用像NHibernate或Entity Framework这样的ORM框架。这为你做了所有这些,还有更多。

你可能想研究在C#中使用正则表达式。 Google上有很多资源可以轻松找到。 只要防止任何可疑字符(如%,=,?,& ...)(可能会导致SQL注入查询)传递给您的方法的参数myQuery。 应该找到。也许这不是专业的方式来做到这一点,但...我只是说。 祝你好运。

+0

感谢您的建议,但请告诉我专业的方式。 – RKh 2010-10-30 18:08:04

不要将您的参数传递给您的查询。创建System.Data.SqlClient.SqlCommand并使用Command.Parameters.Add(...添加参数。这完全防止了SQL注入。