使用参数而不是串联的好处

Benefits of use parameters instead of concatenation

提问人: 提问时间:12/7/2011 最后编辑:Olivier Jacot-Descombes 更新时间:10/27/2023 访问量:3899

问:

我是 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);

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

C# asp.net SQL 注入

评论

2赞 marc_s 12/7/2011
阅读维基百科上的SQL注入,看看妈妈的功绩
0赞 KV Prajapati 12/7/2011
相关文章 : stackoverflow.com/questions/306668/...
1赞 tugberk 12/7/2011
SQL注入与致命注入/防止SQL注入

答:

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 查询提示以避免此问题。RECOMPILEOPTIMIZE FOR

2赞 Petar Ivanov 12/7/2011 #3

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

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

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

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