0

我在登录表单中使用以下代码。但它不关心案件。就像管理员或管理员一样,或者当真正的管理员是管理员时,ADmin 作为用户名是否可以登录到我的系统。这些是我的代码:

sql = "SELECT * FROM tblStaff WHERE Username = @User AND Password = @Pass"
 myCommand = New SqlCommand(sql, myConnection)
 myCommand.Parameters.AddWithValue("@User", txtUser.Text)
 myCommand.Parameters.AddWithValue("@Pass", txtPassword.Text)
 myCommand.ExecuteReader()

…………

请帮忙。

4

2 回答 2

2

您通常应该:

a) 在 case-*中以* 敏感的方式比较用户名 - 您应该只有一个用户的 username admin,但它是拼写的。拥有仅因大小写而异的用户名可能会导致其他用户混淆,试图找出真正的管理员是谁。

b)将密码的散列(最好是加盐散列)存储在二进制列中。

话虽如此,如果您想强制进行区分大小写的比较,可以尝试使用COLLATE子句

SELECT * FROM tblStaff WHERE Username = @User AND Password = @Pass COLLATE Latin1_General_CS_AS

以上仅将 collat​​e 子句应用于密码比较(在这种情况下,我们强制区分大小写(CS)和区分重音(AS)) - 您需要为用户名列复制它(不推荐,请参阅 ( a) 上述)。

于 2011-07-04T09:30:16.787 回答
1

如果您想不区分大小写,那么以下内容应该适合您:

sql = "SELECT * FROM tblStaff WHERE UPPER(Username) = UPPER(@User) AND Password = @Pass

编辑:

如果您希望用户名不区分大小写而密码区分大小写,那么以下内容应该适合您:

SELECT * FROM Users WHERE Username = @User AND (Password = @Pass COLLATE Latin1_General_CS_AS)

如果您希望用户名和密码区分大小写,请尝试以下操作:

SELECT * FROM Users WHERE (Username = @User COLLATE Latin1_General_CS_AS) AND (Password = @Pass COLLATE Latin1_General_CS_AS)
于 2011-07-04T15:30:28.137 回答