SqlParameter对象C#

可能重复:
XKCD SQL注入 - 请解释

我在C#中很新,我想知道。

在C#中构建SQL字符串时,为什么我们需要使用SqlParameter对象来表示用户的输入,而不是直接传入字符串?


我假设你的意思是为什么写得更好:

command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = @FirstName";
// Or whichever form...
command.Parameters.AddParameter("@FirstName").Value = input;

而不是

command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input + "'";

后一种形式有三个问题:

  • 它允许SQL注入攻击,除非你非常小心转义 - 上面的代码不是。 想象一下,如果用户输入:

    ' OR 'x' = 'x
    
  • 它混合了代码和数据。 您无法看到您想要做什么的清晰表示,而第一种形式显示哪些位是固定的,哪些是可变输入

  • 虽然这对于字符串来说不是问题,但参数可避免不必要的数据转换。 例如,当使用日期或日期/时间值时,使用第二种方法时,最终需要担心数据库将接受哪种文本格式,即使您已经开始使用DateTime值(比如说)并且数据库将结束用一些适当的日期/时间类型的值。 通过字符串表示去引起麻烦。

  • 此外,在某些情况下,第一种方法可能会提高性能,允许数据库缓存查询执行计划。 尽管如此,还是有相当多的细微差别,而且它还是数据库特有的。


    简单一点,为了避免SQL注入攻击,并且在某种程度上,它还可以提高性能,因为我们为该参数指定了数据类型,大小等。

    如果你只是想避免SQL注入,我想你可能会使用

    command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input.Replace("'","''") + "'";
    
    链接地址: http://www.djcxy.com/p/93811.html

    上一篇: SqlParameter Object C#

    下一篇: SQL Injection Username and Password