C# 防止SQL注入-但没有参数
我用C#编写了一些代码,用于创建新密码:C# 防止SQL注入-但没有参数,c#,sql,parameters,code-injection,C#,Sql,Parameters,Code Injection,我用C#编写了一些代码,用于创建新密码: SqlCommand cmd = new SqlCommand("select pwdencrypt('" + txtNewPass1.Text + "')", Conn); 现在,它从文本框txtNewPass1中获取文本值,并使用pwdencrypt对其进行加密,然后再将另一位代码放入数据库(该位使用参数) 然而,问题是上面的代码并没有——而且实际上似乎不能。出于某种原因,使用参数(而不是txtNewPass1.Text)似乎会返回错误的值(实际上
SqlCommand cmd = new SqlCommand("select pwdencrypt('" + txtNewPass1.Text + "')", Conn);
现在,它从文本框txtNewPass1中获取文本值,并使用pwdencrypt对其进行加密,然后再将另一位代码放入数据库(该位使用参数)
然而,问题是上面的代码并没有——而且实际上似乎不能。出于某种原因,使用参数(而不是txtNewPass1.Text)似乎会返回错误的值(实际上,我现在想知道是否可以通过将txtNewPass1.Text放入字符串,然后通过参数传递来解决这个问题)。至少在本例中,使用参数会给我们一个与值不匹配的密码
还有谁见过这个吗?D'oh!我真的不想自己回答这个问题,因为我太尴尬了,但是嘿嘿
SqlCommand cmd = new SqlCommand("select pwdencrypt(@MyPass)", Conn
我将单引号保留在中,因此它试图加密(“@MyPass”),而不是(@MyPass)。因此,每次它都将@MyPass作为密码进行加密,而不是将@MyPass表示的内容作为字符串进行加密
别理我,现在太早了。隐马尔可夫模型。。。快到午餐时间了
出于某种原因,使用参数(而不是txtNewPass1.Text)似乎会返回错误的值
您应该使用参数,除非绝对不可能这样做;任何“错误的值”都很可能是
varchar
和nvarchar
之间的差异-因此,要小心知道您想要的是什么,以及您正在使用的是什么(pwdencrypt('foo')
与pwdencrypt(N'foo')
)。也;考虑<代码> HasByths<代码>而不是<代码> pWdEngRyp><代码> > < /p>您使用的是哪个数据库和版本?当您尝试将其作为参数时,代码是什么?感谢您的响应,但不要担心,我今天有点傻。注意:SQLBOL建议使用hashbytes
而不是pwdencrypt
。无法使用参数的一个例子是使用CREATE LOGIN
,它要求登录名的对象名不能参数化。