我正在使用 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/