提问人: 提问时间:12/7/2011 最后编辑:Olivier Jacot-Descombes 更新时间:10/27/2023 访问量:3899
使用参数而不是串联的好处
Benefits of use parameters instead of concatenation
问:
我是 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);
提前感谢您提供的任何知识。
答:
8赞
ℍ ℍ
12/7/2011
#1
- 安全。串联为 SQL 注入打开了大门,尤其是当 TB 代表 Textbox 时。(必修XKCD动画片)
- 类型安全。您可以解决许多 DateTime 和数字格式问题。
- 速度。查询不会一直更改,系统可能能够重用查询句柄。
评论
0赞
gymcode
12/7/2011
感谢您的指点。参数如何防止 SQL 注入。与串联相比,它仍然接受相同的输入,这就是我不太明白的一点。
1赞
ℍ ℍ
12/7/2011
看漫画。连接时,黑客可能会接管您的 SQL。参数从来都不是 SQL 命令。
3赞
Martin Smith
12/7/2011
#2
优势
SQL注入避免是主要的。它确保了用户提供的数据和可执行代码的完全分离。
这也意味着,当人们无辜地搜索短语时,您的应用程序将正常工作,而无需您手动转义所有这些搜索词。O'Brien
例如,使用参数可以避免字符串表示形式中日期格式不明确的问题。datetime
如果是 SQL Server,则意味着更好地使用计划缓存。它没有编译和存储大量类似的临时查询,而只有一个可重用的查询。
弊
没有:
由于不恰当地重用计划,可能偶尔会遇到参数探查问题,但这并不意味着不应在此事件中使用参数化查询。在 SQL Server 中,通常会添加 or 查询提示以避免此问题。RECOMPILE
OPTIMIZE FOR
2赞
Petar Ivanov
12/7/2011
#3
一个很好的理由是防止SQL注入。
想象一下,如果你等于:usernameTB.Text
"'some text', 'password') GO; DROP TABLE [USER DATA] GO;"
如果您使用参数,则此字符串将被正确转义(例如,' 替换为 ''),因此它将成为字段的值。
评论