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

c8ib6hqw  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(105)

我是一个ASP.NET和C#编程的新手。
我想知道在SQL语句中使用参数而不是串联的区别和优点加缺点是什么,因为我听说这是防止SQL注入的更好方法(?)
下面是我从使用串联改为使用参数的示例SQL语句:
串联:

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


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

wn9m85ua

wn9m85ua1#

  • 安全性。连接为您打开了SQL注入的大门,特别是当TB代表Textbox时。(强制性XKCD cartoon
  • 类型安全。你解决了很多日期时间和数字格式问题。
  • 速度。查询并不总是改变,系统可能能够重用查询句柄。
7vux5j2d

7vux5j2d2#

优势

SQL注入避免是主要的一个。它确保了用户提供的数据和可执行代码的完全分离。
这也意味着,当人们无意中搜索像O'Brien这样的短语时,您的应用程序将正常工作,而无需手动转义所有这些搜索词。
例如,使用datetime参数可以避免字符串表示中日期格式不明确的问题。
如果是SQL Server,这意味着更好地使用计划缓存,而不是编译和存储大量类似的临时查询,它只需要重用一个。

缺点

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

fdbelqdn

fdbelqdn3#

一个很好的理由是要防止SQL注入。
假设usernameTB.Text等于:

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

字符串
如果您使用参数,这个字串会被正确逸出(例如,'会被'取代),因此它会成为字段的值。

相关问题