vb.net - 登录时出现问题

时间:2011-07-04 09:15:49

标签: vb.net parameters sqlcommand executereader

我在登录表单中使用以下代码。但它并不关心案件。就像管理员或管理员一样,或者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()

..........

请帮忙。

2 个答案:

答案 0 :(得分:2)

您通常应该:

a)比较案例中的用户名 - * *敏感方式 - 您应该只有一个用户使用用户名admin,但它是拼写的。如果用户名只是因情况而异,可能会导致其他用户混淆,试图找出真正的管理员是谁。

b)在二进制列中存储哈希(最好是 salted 哈希)密码。

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

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

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

答案 1 :(得分: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)