将查询作为参数传递

时间:2010-10-30 17:53:18

标签: c# .net .net-3.5

我知道,不推荐。 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注入的情况下,实现这一目标的专业方法是什么?

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

3 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 您可以创建查询说明。您可以通过创建带有表名的InsertQuery类来完成此操作。有了这个,您可以添加过滤器,例如:创建一个类EqualFilter,然后您可以使用AndFilter进行组合以获得两个相等的比较;

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可能希望研究C#中正则表达式的用法。 Google上有大量资源可供您轻松找到。 只需防止任何可疑字符,如%,=,?和& ...(可能导致SQL注入查询)被传递给方法的参数myQuery。 那应该找到。也许这不是专业的方式,但......我只是说。 祝你好运。