【问题标题】:Adding data to the database and how to make it right将数据添加到数据库以及如何使其正确
【发布时间】:2012-07-13 09:07:02
【问题描述】:

我一直在写一些简单的 c#,我通常使用相同的类和函数来插入和获取数据库中的数据。

例如,这是我的函数:

    public bool insert_and_ConfirmSQL(String Query, String comments)
    {
        bool success = false;
        NpgsqlCommand cmd = new NpgsqlCommand();
        NpgsqlConnection mycon = new NpgsqlConnection();
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};timeout=1000;CommandTimeout=120;", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        mycon.ConnectionString = connstring;
        cmd = mycon.CreateCommand();
        cmd.CommandText = Query;
        mycon.Open();

        int temp = 0;
        try
        {
            temp = cmd.ExecuteNonQuery();
            success = true;
        }
        catch
        {
           if (mycon.State == ConnectionState.Open)
            {
                mycon.Close();
            }
        }

        return success;
    }

现在我知道这个查询对于注入是不安全的,我需要使用准备好的语句。但是我不明白当我的每个查询都不同时我应该如何处理这个问题?是否有一个“通用”函数可以插入任何查询并“准备”它?

【问题讨论】:

  • 我假设您正在尝试防止 SQL 注入攻击。你能展示你的查询字符串是如何构造的吗,因为这才是真正重要的。在您的代码示例中,您只是将 SQL 查询作为参数传递 - 我们无法查看该查询是如何组合在一起的;这就是您的注射预防工作应该重点关注的地方。

标签: c# sql optimization


【解决方案1】:

我建议你这样使用它,因为 using 语句负责处理连接和命令

另外为了安全防止sqlinjection请SqlParameters(Npgsl中的等价物)传值

public void insert_and_ConfirmSQL(String Query, String cmets) {

     using(NpgsqlConnection mycon = new NpgsqlConnection())
      {
        using(NpgsqlCommand cmd = mycon.CreateCommand())
        {
              string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};timeout=1000;CommandTimeout=120;", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
              mycon.ConnectionString = connstring;
              cmd = mycon.CreateCommand();
             cmd.CommandText = Query;
              mycon.Open();

            cmd.ExecuteNonQuery();
       }
     }

}

【讨论】:

  • 虽然他应该使用using命令来关闭连接和清理资源,但他的问题似乎实际上是关于避免SQL注入攻击。也许您的答案应该进入 cmets 部分?
  • 我看不出这如何防止 sql 注入
  • @Greg 在我的回答中我建议 OP 使用 SqlParameters(在 Npgsl 中等效)来传递值
【解决方案2】:

如果您正在寻找一种更通用的方式来执行插入/更新/删除,也许以下是合适的(使用 SqlClient 但很容易适应 NpgsqlClient):

public static object ExecuteActionProcedure(System.Data.CommandType CommandType, string CommandText, string[] Parameters, object[] Values)
{
  try
  {
    using (SqlConnection con = new SqlConnection())
    {
      con.ConnectionString = ConfigurationManager.ConnectionStrings["YourConnection"].ConnectionString;
      con.Open();
      using (SqlCommand cmd = new SqlCommand())
      {

        cmd.Connection = con;
        cmd.CommandType = CommandType;
        cmd.CommandText = CommandText;
        SqlParameter result = new SqlParameter();
        result.ParameterName = "ResultValue";
        result.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(result);
        for (int i = 0; i < Parameters.Length; i++)
        {
          cmd.Parameters.AddWithValue(Parameters[i], Values[i]);
        }
        cmd.ExecuteNonQuery();
        return (int)result.Value;
      }
    }
  }
    }
  }
  catch (Exception ex)
  {
    throw new Exception(ex.Message);
    return null;
  }
}

调用语句:

ExecuteActionProcedure(CommandType.StoredProcedure, "aspnet_SaveFullName", new string[] { "UserName", "FullName" }, new object[] { model.UserName, model.FullName });

请注意,您可以向此方法传递一个包含参数以及存储过程的 SQL 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多