c# - 如何在 C# 桌面应用程序中避免没有存储过程的 SQL 注入(inject)

标签 c# sql

我正在使用 MS SQL 服务器数据库开发 C# 桌面应用程序。 我保持不同的类如下连接到数据库。

 using System.Data.Odbc;

class DataBaseConnection
    {
        private OdbcConnection conn1 = new OdbcConnection(@"FILEDSN=C:/OTPub/Ot.dsn;" + "Uid=sa;" + "Pwd=otdata@123;"); //"DSN=Ot_DataODBC;" + "Uid=sa;" +  "Pwd=otdata@123;"

        //insert,update,delete
        public int SetData(string query)
        {
            try
            {
                conn1.Open();
                OdbcCommand command = new OdbcCommand(query, conn1);
                int rs = command.ExecuteNonQuery();
                conn1.Close();
                return rs;
            }
            catch (Exception ex)
            {
                conn1.Close();
                throw ex;
            }
        }
        //select
        public System.Data.DataTable GetData(string sql)
        {
            try
            {
                conn1.Open();
                OdbcDataAdapter adpt = new OdbcDataAdapter(sql, conn1);
                DataTable dt = new DataTable();
                adpt.Fill(dt);
                conn1.Close();
                return dt;
            }
            catch (Exception ex)
            {
                conn1.Close();
                throw ex;
            }
        }

   }

在我需要的地方,我对 DatabaseConnection 类提出了反对意见,并根据要求调用 get 和 set 方法。

举个例子----

 DataBaseConnection db = new DataBaseConnection();

 string SaveNewEmp = "INSERT INTO Employee  (Service_ID, Title, Name, Initials, ) VALUES ('" + servicenumber + "','" + title + "','" + fullname + "','" + initials + "')";
                    int returns = db.SetData(SaveNewEmp);
  • 我可以通过这种方法进行 SQl 注入(inject)吗?
  • 如何在不使用存储过程的情况下避免sql注入(inject)?

最佳答案

您可以像在其他任何地方一样避免 SQL 注入(inject) - 通过将 SQL 代码数据 分开。如果您坚持让接口(interface)仅基于传入的字符串,则无法做到这一点。

我会摆脱你的包装类(它只是模糊的东西)并利用 Parameters将数据与您的查询一起传递。


(我还建议您只在各种数据库对象周围使用 using 语句,而不是您当前的手动操作来确保 Close 被调用,这也有点破坏通过重新抛出异常进行良好的错误处理)

(此外,我建议您在任何需要的地方使用新的 OdbcConnection 对象,而不是尝试共享一个对象——一旦想到多线程进入你的代码库,这在如今几乎是不可避免的)

关于c# - 如何在 C# 桌面应用程序中避免没有存储过程的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42993817/

相关文章:

c# - 使用 LINQ to SQL 的简单 LINQ 查询,认为我做错了什么

c# - 如何在 Windows 中获取和设置系统音量

c# - 在 C# 中使用嵌套在泛型类中的类作为类型参数

sql - 使用sql Developer从oracle读取xml标签值

SQL Server - 查找日期范围(不包括年份)之间的人员

c# - 如何找到datagridview中存在的行并将其附加到datagridview的最后一行

mysql - 如何从sqlite数据库中的where子句获取多个元组

mysql - 在不使用代码服务器的情况下同时更新和转换列的值

sql - 如果传递 null 将引发错误的 TSQL 函数?

c# - 为什么十进制最小值不转换为字符串?