防止SQL注入 - 但没有参数

时间:2013-07-02 09:49:34

标签: c# sql parameters code-injection

我在C#中有一些用于创建新密码的代码:

SqlCommand cmd = new SqlCommand("select pwdencrypt('" + txtNewPass1.Text + "')", Conn);

现在,这将从文本框txtNewPass1中获取文本值,并使用pwdencrypt对其进行加密,然后将另一部分代码放入数据库(该位使用参数)。

然而,问题是上面的代码没有 - 实际上似乎无法做到。使用参数(而不是txtNewPass1.Text)似乎由于某种原因带回了错误的值(实际上,我现在想知道我是否可以通过将txtNewPass1.Text放入字符串,然后通过参数传递它来解决这个问题) 。至少在这种情况下,使用参数会给我们一个与我们的值不匹配的密码。

其他人之前遇到过这个?

2 个答案:

答案 0 :(得分:5)

  

唱一个参数(而不是txtNewPass1.Text)似乎因某种原因带回了错误的值

您应该使用参数,除非绝对不可能这样做;任何“错误的价值”很可能是varcharnvarchar之间的差异 - 所以要小心你知道你想要哪个,以及你使用的是什么(pwdencrypt('foo')与{{pwdencrypt(N'foo')不同1}})。也;考虑hashbytes而不是pwdencrypt

答案 1 :(得分:4)

D'哦!我真的不想回答这个问题,因为我太尴尬了,但是嘿嘿......

SqlCommand cmd = new SqlCommand("select pwdencrypt(@MyPass)", Conn

我正在留下单引号,所以它试图加密('@ MyPass'),而不是(@MyPass)。因此每次它都将@MyPass加密为密码,而不是@MyPass表示为将其视为字符串。

忽略我,现在还太早。嗯......差不多午餐时间......