我是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);
提前感谢您提供的任何知识。
答案 0 :(得分:8)
答案 1 :(得分:3)
<强>优点强>
SQL注入避免是主要的。它确保完全分离用户提供的数据和可执行代码。
这也意味着当人们无意中搜索O'Brien
之类的短语而您无需手动转义所有这些搜索字词时,您的应用程序就能正常运行。
例如,使用datetime
参数可以避免字符串表示中出现模糊日期格式的问题。
如果是SQL Server,则意味着更好地使用计划缓存。
而不是编译和存储类似的特殊查询的负载<强>缺点强>
无:
由于不恰当地重复使用计划,您可能偶尔会遇到参数嗅探问题,但这并不意味着您不应在此事件中使用参数化查询。在SQL Server中,您通常会添加RECOMPILE
或OPTIMIZE FOR
查询提示以避免此问题。
答案 2 :(得分:2)
一个很好的理由是防止SQL注入。
想象一下,如果您的usernameTB.Text
等于:
"'some text', 'password') GO; DROP TABLE [USER DATA] GO;"
如果您使用参数,此字符串将被正确转义(例如'替换为''),因此它将成为该字段的值。