vb.net - проблема при входе - PullRequest
0 голосов
/ 04 июля 2011

Я использую следующий код в форме входа в систему. но это не заботится о случаях. Точно так же, как admin или Admin, или может ли ADmin как имя пользователя войти в мою систему, если реальным является 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 ]

2 голосов
/ 04 июля 2011

Как правило, вы должны:

a) Сравните имена пользователей в регистре - * чувствительным образом * - у вас должен быть только один пользователь с именем пользователя admin, однако он записан. Наличие имен пользователей, которые различаются только в зависимости от конкретного случая, может привести к путанице для других пользователей, пытающихся понять, кто настоящий администратор.

b) Храните хэшей (предпочтительно соленые хэши) паролей в двоичном столбце.

При этом, если вы хотите, чтобы происходило сравнение с учетом регистра, вы можете попробовать использовать COLLATE предложение :

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

Вышеприведенное относится только к предложению сопоставления для сравнения паролей (в этом случае мы принудительно вводим регистр символов (CS) и код Accent Sensitive (AS)) - вам необходимо дублировать его для столбца имени пользователя (не рекомендуется см. (а) выше).

1 голос
/ 04 июля 2011

Если вы хотите, чтобы регистр был нечувствителен , тогда вам подойдет следующее:

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

EDIT:

Если вы хотите, чтобы имя пользователя было нечувствительным , а пароль * чувствителен , то для вас должно работать следующее:

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)
...