【问题标题】:Preventing SQL injection - but without parameters防止 SQL 注入 - 但没有参数
【发布时间】:2013-07-02 09:49:33
【问题描述】:

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

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

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

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

以前有人遇到过这个吗?

【问题讨论】:

  • 您使用的是哪个数据库和版本?当您将其作为参数尝试时,代码是什么?
  • 感谢您的回复,但别担心,我今天只是有点笨。

标签: c# sql parameters code-injection


【解决方案1】:

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

您应该使用参数,除非它绝对不可能这样做;任何“错误值”很可能是varcharnvarchar 之间的区别 - 所以要小心你知道你想要哪个,你正在使用哪个(pwdencrypt('foo')pwdencrypt(N'foo') 不同)。还;考虑hashbytes 而不是pwdencrypt

【讨论】:

  • 无法使用参数的例子是CREATE LOGIN,它需要一个无法参数化的登录对象名。
【解决方案2】:

天啊!真的不想自己回答这个问题,因为我太尴尬了,但是嘿嘿......

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

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

别理我,早上太早了。嗯……快到午餐时间了……

【讨论】:

  • 注意:SQLBOL 推荐hashbytes 而不是pwdencrypt
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2010-09-23
  • 2018-03-23
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多