2013-07-02 48 views
0

我有在C#中的一些代码,被用来创建新密码:防止SQL注入 - 但没有参数

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

现在,这需要从文本框中txtNewPass1我们的文本值,并使用pwdencrypt在另一部分代码放入数据库(该位使用参数)之前对其进行加密。

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

之前有人遇到过这个吗?

+0

你使用哪个数据库和版本?当您将其作为参数尝试时,代码是什么? –

+0

感谢您的回应,但不用担心,今天我只是有点愚蠢。 – user1560834

回答

4

D'oh!真的不想回答这个我自己,因为我太尴尬,但嘿浩...

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

我留下于是有人试图加密(“@MyPass”)单引号,而不是(@MyPass)。所以每次它将@MyPass作为密码进行加密,而不是@MyPass所表示的,因为它将其视为一个字符串。

忽略我,现在已经太早了。嗯......近午饭时间...

+0

注意:SQLBOL建议'hashbytes'而不是'pwdencrypt'。 –

+0

+1为诚信:-) –

5

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

你应该使用一个参数,除非它是绝对不可能这样做;任何“错误的值”最有可能是varcharnvarchar之间的差异 - 所以要小心你知道你想要什么,以及你正在使用哪一个(pwdencrypt('foo')不等于pwdencrypt(N'foo'))。也;考虑hashbytes而不是pwdencrypt

+0

无法使用参数的例子是使用'CREATE LOGIN',它需要一个无法参数化的登录对象名称。 – Dai