C# C语言中的代码错误

C# C语言中的代码错误,c#,winforms,C#,Winforms,此代码的缺点是什么: SqlConnection con = new SqlConnection(); con.ConnectionString = @"Data Source=.\sqlExpress;Initial Catalog=Learn;Integrated Security=True"; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "Insert Into tblUser(name,family,tel)Values('"

此代码的缺点是什么:

SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\sqlExpress;Initial Catalog=Learn;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Insert Into tblUser(name,family,tel)Values('" + txtName.Text + "','" + txtFamily.Text + "','" + txtTel.Text + "')";
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
con.Open();
cmd.ExecuteNonQuery();
con.Close();

您的意思是,除了SqlConnection不会被释放,而且SqlCommand的编写方式会引发SQL注入攻击之外

相关XKCD漫画:


一个主要的缺点是您不引用字符串或使用参数化查询,因此输入O'Brien作为姓氏的人将得到一个例外


当然,这也意味着有人可以在文本框中输入任意SQL,并让您为他们执行。这很糟糕。

与安全编码相关


您的代码容易受到SQL注入攻击,因为您直接在代码中使用txtName.text来形成查询。应使用参数化查询。此外,您应该在使用txtName.txt之前验证它。就是这样。

缺陷和缺点不是一回事。此代码是否无法执行您想要的操作?你为什么要问这段代码的缺点?为了更好地回答这个问题,我们需要更多的信息。你认为有哪些缺点?如果你已经写了,我假设你有一些顾虑。挑剔:除非出现异常,否则连接将被处理。OP肯定应该使用块来包装连接和命令。标签上写着winforms,所以SQL注入不是什么攻击。如果WiFrreApp可以访问数据库,用户就可以执行他们想要的任何SQL数据库。@ GABE,您仍然需要考虑来自授权用户的SQL注入攻击的可能性。它可以被恶意地用来破坏数据,或者提升访问权限,查看不允许他们访问的信息。仅仅因为它是通知,并不意味着他们有权删除数据库中的表;这不是真正的攻击。运行此程序的用户已经可以访问数据库。他们可以在十六进制编辑器中打开EXE,复制连接字符串,将其粘贴到他们最喜欢的SQL管理器中,并且能够针对DB执行任何他们想要的SQL。@Gabe-我听说了。我想我们都同意,在将输入传递到SQL命令字符串时,对输入进行这样的清理仍然是一种必要的做法。不过,实际上,准备一个未格式化的文本命令并对数据库执行该命令很少是一件好事。验证txtName.txt意味着什么?你是说有一些无效的值吗;升降台tblUser;-将是一个无效的值-尽管如果使用参数化查询不会造成任何影响。@Joel:为什么这不是一个有效的名称?如果这是Bobby的名字,应该允许用户将其输入数据库并存储在那里。