我正在检查用于登录MS SQL SERVER 2005中的过程的用户名和密码。由于SQL Server 2005不区分大小写,即使用户提供小写密码而不是大写密码,系统也允许登录。
我该怎么办?在Sql Server 2005中是否有任何命令可以检查相同的??
答案 0 :(得分:3)
使用区分大小写的排序规则 - 例如
...where Password = @password COLLATE SQL_Latin1_General_CP1_CS_AS
是的,您不应该将纯文本密码存储在数据库中!
答案 1 :(得分:1)
永远不会存储纯文本密码!存储密码的哈希并进行比较。您可以使用HashBytes()功能。
答案 2 :(得分:0)
SQL Server 2005仅使用不区分大小写的比较进行默认排序规则。您不应将密码存储在纯文本中。您应该使用合理安全的散列算法对它们进行散列并存储散列。 (也许你应该真的使用salt值,但让我们从散列开始)。
答案 3 :(得分:0)
使用区分大小写的collation进行比较,例如:
SELECT
Id
FROM
UserTable
WHERE
UserName = @UserName
AND Password = @Password COLLATE SQL_Latin1_General_Cp1_CS_AS
使用与密码列的字符集匹配的归类。
另一个注意事项 - 您确定要在数据库中存储明文密码吗?在安全决策方面,这在“不应该做的事情”中名列前五。
答案 4 :(得分:-2)
在某些情况下,您可能希望存储明文密码,因此我不会重复其他人的建议,尽管它通常是合理的。
除了设置排序规则外,您还可以使用varbinary技巧:
WHERE
CAST(Password as varbinary(20)) = CAST(@Password as varbinary(20)) AND
CAST(Username as varbinary(20)) = CAST(@Username as varbinary(20))
以上内容也会导致区分大小写的搜索 - 只需记住将varbinary长度设置为与字段长度相同。
为了避免索引扫描,您也可以包括不区分大小写的搜索 - 它将进行索引搜索并在之后执行varbinary搜索:
WHERE
Password = @Password AND
Username = @Username AND
CAST(Password as varbinary(20)) = CAST(@Password as varbinary(20)) AND
CAST(Username as varbinary(20)) = CAST(@Username as varbinary(20))