将查询包含在C#代码中的最佳方法

时间:2015-08-24 06:45:12

标签: c# sql-server sql-injection

我是将数据库集成到程序中的新手,我最近开始处理连接到SQL数据库的Windows窗体(C#)。 在我的代码中,我以下列方式拧紧SQL语句:

sc.Open();
string Get_Form = ("SELECT MoM_Form.MoM_ID FROM MoM_Form WHERE MoM_Form.MoM_ID='" + TextBox_FormID.Text + "'");
SqlCommand cmd = new SqlCommand(Get_Form, sc);
int Get_Form_ID = Convert.ToInt32(cmd.ExecuteScalar());
sc.Close();

但是,我记得有关SQL注入的一课,它清除了你不应该允许用户直接将数据插入到SQL语句中。

这是将SQL语句写入代码的正确而安全的方法吗? 其次,如果我禁止用户插入字符串作为'进入文本框,他还能做到伤害吗? 第三,如果不是,哪种插入方式最好?使用程序和参数?

2 个答案:

答案 0 :(得分:6)

您是否有充分的理由不使用 ORM?实体框架,Linq to SQL,NHibernate ,仅举几例。除非您正在执行一些非常复杂的SQL语句,否则ORM每次都是合乎逻辑的选择。它将处理连接,提供一定程度的安全性(即采取措施避免SQL注入),以及使代码更容易阅读和维护。

答案 1 :(得分:1)

  

这是将SQL语句写入代码的正确而安全的方法吗?

不,不是;你的直觉是正确的。

  

其次,如果我禁止用户将字符串作为'插入文本框,他仍然能够造成伤害吗?

可能,虽然它不会那么微不足道。

  

第三,如果不是,哪种插入方式最好?使用程序和参数?

是的,使用参数。尽管可以使用存储过程,但不需要使用存储过程。您可以使用Parameters.AddWithValue

SqlCommand对象添加参数
sc.Open();

string getForm = ("SELECT MoM_Form.MoM_ID FROM MoM_Form WHERE MoM_Form.MoM_ID=@id");

SqlCommand cmd = new SqlCommand(getForm, sc);
cmd.Parameters.AddWithValue("id", TextBox_FormID.Text)

int Get_Form_ID = Convert.ToInt32(cmd.ExecuteScalar());

sc.Close();