2013-06-21 4 views
-1

Используя текстовые поля с именем пользователя и паролем, я пытаюсь проверить, что имя пользователя и пароль находятся в таблице по щелчку. Ниже приводится то, что у меня есть для кнопки. Если возможно, кто-то может это рассмотреть и сказать мне, где я ошибаюсь? Я новичок в этом и могу действительно использовать некоторые советы.Проверьте имя пользователя и пароль onclick в Visual Studio

Благодарим за помощь, мы очень благодарны!

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Protected Sub butSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles butSubmit.Click 

     Dim myReader As Data.SqlClient.SqlDataReader 
     Dim mySqlConnection As Data.SqlClient.SqlConnection 
     Dim mySqlCommand As Data.SqlClient.SqlCommand 
     'Establish the SqlConnection by using the configuration manager to get the connection string in our web.config file. 

     mySqlConnection = New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ToString()) 
     Dim sql As String = "SELECT password FROM MyUsers WHERE username = '" & Me.logon_id.Text & "'" 
     mySqlCommand = New Data.SqlClient.SqlCommand(sql, mySqlConnection) 



     Try 

      mySqlConnection.Open() 
      myReader = mySqlCommand.ExecuteReader() 

      If (myReader.HasRows) Then 
       myReader.Read() 
       Dim password As String = myReader("password") 
       If (password = Me.user_password.Text) Then 
        'Open page with users and roles 
        Dim message As String = "Correct password" 
        Dim style As MsgBoxStyle = MsgBoxStyle.OkOnly 
        Dim title As String = "Authenticated" 
        MsgBox(message, style, title) 

       End If 
      End If 

     Catch ex As Exception 
      Console.WriteLine(ex.ToString()) 
     Finally 
      If Not (myReader Is Nothing) Then 
       myReader.Close() 
      End If 

      If (mySqlConnection.State = Data.ConnectionState.Open) Then 
       mySqlConnection.Close() 
      End If 

     End Try 

    End Sub 
End Class 

=========================================== ===================

Обновление:

Спасибо за Ваше сообщение. Благодарим вас за советы относительно создания хэша пароля. Это имеет смысл, но это начинающий проект, и я не думаю, что это было частью требований.

Полный проект состоит в том, чтобы создать три таблицы: MyUsers, MyRole & UserRoles. В таблице UserRole предполагается связать пользователя с несколькими ролями. Первый столбец будет содержать ссылку на пользователя. Второй столбец будет содержать ссылку на роль.

Я предположил, что создал 2 веб-страницы. Один с таблицей, которая содержит всю информацию о пользователе и там роли, а вторая, которая имеет имя пользователя и пароль, которые предположительно должны подключаться к таблице, и убедитесь, что введенная информация соответствует тому, что находится в таблице.

Ниже мой SQL-код:

user_description VARCHAR(100) NOT NULL, 

user_password VARCHAR(50) NOT NULL, 
); 

INSERT INTO MyUsers (user_logon_id, user_full_name, user_description, user_password) VALUES 
('mcoby', 'Mary Coby', 'Class Instructor', 'password'); 


CREATE TABLE MyRole 
(
myrole_id INT IDENTITY(1,1)PRIMARY KEY, 

role_name VARCHAR(50) NOT NULL, 

role_description VARCHAR(100) NOT NULL, 
); 

INSERT INTO MyRole (role_name, role_description) VALUES ('administrator', ' Administrator of the web site'); 

INSERT INTO MyRole (role_name, role_description) VALUES ('user', ' User of the web site'); 


CREATE TABLE UserRoles 
(
    user_id int FOREIGN KEY REFERENCES MyUsers(id), 

    role_id int FOREIGN KEY REFERENCES MyRole(myrole_id), 
); 
+0

Без дополнительной информации о том, что представляет собой настоящая проблема: проголосовали за закрытие, чтобы его переместили на [codereview.se] – hometoast

ответ

4

Не отправлять/получать четкий текст пароля из/в базе данных.
Вы должны создать хэш пароля и сохранить его. Когда вам нужно проверить пароль, вы повторно применяете хэш-функцию и проверяет базу данных.

Также конкатенация строк используется в тексте команды, это очень плохая практика. Вы должны использовать параметр «Всегда» с параметризованным запросом, чтобы избежать SQL-инъекций и проблем с синтаксическими анализами со строками, содержащими одинарные кавычки или десятичные знаки и даты, не распознанные базой данных.

Наконец, соединение, команда, дата-каталог - все одноразовые объекты и, следовательно, это лучше использовать используя заявление

Это просто пример, не тестируется

Dim sql As String = "SELECT password FROM MyUsers WHERE username = @uname" 
    Using mySqlConnection = New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ToString()) 
    Using mySqlCommand = New Data.SqlClient.SqlCommand(sql, mySqlConnection) 
     mySqlConnection.Open() 
     mySqlCommand.Parameters.AddWithValue("@uname", Me.logon_id.Text) 
     result = mySqlCommand.ExecuteScalar() 
     if result Is Nothing Then 
      ' User not found 
     Else 
      Dim pwHash = GetHashedText(Me.user_password.Text) 
      if result.ToString = pwHash Then 
       'Open page with users and roles 
       Dim message As String = "Correct password" 
       Dim style As MsgBoxStyle = MsgBoxStyle.OkOnly 
       Dim title As String = "Authenticated" 
       MsgBox(message, style, title) 
      Else 
       ' wrong Password 
      End If 
     End If 
    End Using 
    End Using 
End Sub 

Private Function GetHashedText(ByVal clearText As String) As String 
    Dim e As New UnicodeEncoding() 
    Dim sourceBytes() As Byte = e.GetBytes(clearText) 
    Dim md5 As New MD5CryptoServiceProvider() 
    Dim hashedBytes() As Byte = md5.ComputeHash(sourceBytes) 
    Return Convert.ToBase64String(hashedBytes) 
End Function 

Как вы можете видеть, что я извлекал SqlDataReader, потому что я полагаю, что у вас есть только один пользователь с именем пользователя при условии, и так запрос возвращает только одну строку (или ноль) и только пароль col итп. Затем пароль, введенный пользователем, хэшируется, а затем проверяется на хеширование, возвращаемое базой данных. Нет четкого текста пароля по проводу, а на стороне базы данных пароль шифруется таким образом, что ни один администратор удаленной машины не смог восстановить исходный текст.

+0

Я добавил дополнительную информацию к вышеуказанному вопросу. Благодарю за ваш ответ. Я действительно новичок в этом, поэтому любой совет всегда очень ценится! –