我正在使用VS2010 C#开发一个asp.net Web应用程序,它涉及用户注册和登录。 如果用户在登录时输入密码并在密码末端附加任意数量的空格,则应用程序允许他登录,无论MS SQL SERVER数据库中的密码是否包含最后的空格或不。我希望它从数据库中验证用户在密码字段中输入的确切密码。 例: 如果在数据库中密码保存为" mypass" 并且用户输入密码为" mypass" 它允许登录,反之亦然。
我不想使用修剪,因为它会禁止用户在其密码中包含空格。
我的密码字段的类型为:nvarchar(50)
请帮帮我..!
答案 0 :(得分:1)
如果要在数据库中存储纯文本密码,那么你做错了。
数据库应包含密码的哈希值和该用户的salt。
当用户输入密码时,您使用用户salt对其进行哈希处理并将其与数据库进行比较。
答案 1 :(得分:1)
正如其他人所说,你不应该用纯文本存储它们......
在回答这个问题时,您可以使用DATALENGTH()
函数来比较值的长度:
DECLARE @pass AS VARCHAR(10) = 'pass '
SELECT (CASE WHEN @pass = 'pass' and DATALENGTH(@pass) = DATALENGTH('pass')
THEN 1
ELSE 0
END) AS IsMatch
此示例将返回false,因为值的实际长度不匹配,否则将使用密码。
如果没有比较数据长度的函数,它将返回true。
注意: LEN()
函数也会忽略尾随空格,因此无法取代DATALENGTH()
,请参阅here。
关于此问题的MS报价:
ANSI标准要求填充所用的字符串 比较,以便在比较它们之前它们的长度匹配。该 padding直接影响WHERE和HAVING子句的语义 谓词和其他Transact-SQL字符串比较。 例如, Transact-SQL考虑字符串' abc'和' abc'相当于 对于大多数比较操作。