使用参数而不是连接的好处

时间:2011-12-07 09:11:26

标签: c# asp.net sql sql-injection

我是ASP.NET和C#编程的新手。

我想知道在SQL语句中使用参数而不是连接有什么区别和优点加上缺点,因为我听说这是防止SQL注入的更好方法(?)

下面是我使用串联更改为参数的示例INSERT语句:

连接:

string sql = string.Format("INSERT INTO [UserData] (Username, Password, ...) VALUES ('" + usernameTB.Text + "', '" + pwTB.Text + "',...);

参数:

cmd.CommandText = "INSERT INTO [UserData] (Username, Password, ...) VALUES (@Username, @Password, ...)";

cmd.Parameters.AddWithValue("Username", usernameTB.Text);
cmd.Parameters.AddWithValue("Password", pwTB.Text);

提前感谢您提供的任何知识。

3 个答案:

答案 0 :(得分:8)

  • 安全。连接打开了SQL注入,特别是当TB代表Textbox时。 (强制性XKCD cartoon
  • 类型安全。您解决了很多DateTime和数字格式问题。
  • 速度。查询不会一直更改,系统可能能够重用查询句柄。

答案 1 :(得分:3)

<强>优点

SQL注入避免是主要的。它确保完全分离用户提供的数据和可执行代码。

这也意味着当人们无意中搜索O'Brien之类的短语而您无需手动转义所有这些搜索字词时,您的应用程序就能正常运行。

例如,使用datetime参数可以避免字符串表示中出现模糊日期格式的问题。

如果是SQL Server,则意味着更好地使用计划缓存。

而不是编译和存储类似的特殊查询的负载

<强>缺点

无:

由于不恰当地重复使用计划,您可能偶尔会遇到参数嗅探问题,但这并不意味着您不应在此事件中使用参数化查询。在SQL Server中,您通常会添加RECOMPILEOPTIMIZE FOR查询提示以避免此问题。

答案 2 :(得分:2)

一个很好的理由是防止SQL注入。

想象一下,如果您的usernameTB.Text等于:

"'some  text', 'password') GO; DROP TABLE [USER DATA] GO;"

如果您使用参数,此字符串将被正确转义(例如'替换为''),因此它将成为该字段的值。