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