Member 13913276 Ответов: 1

Как я могу создать многоуровневую форму входа с помощью VB.NET а доступ к базе данных ?


Я хочу знать, как перенаправить на форму администратора или форму пользователя и т. д. На форму входа с помощью использования VB.Сеть и доступ к базе данных

Что я уже пробовал:

Private Sub Btlogin_Click(sender As System.Object, e As System.EventArgs) Handles Btlogin.Click
        Dim warning As String = "Warning!" & vbNewLine & vbNewLine + _
            "If attempt var = 3" + vbNewLine + _
            "System will shut down."
        If (Textuser.Text = "") And (Textpassword.Text = "") Then
            attempt = attempt + 1
            MsgBox("Please input username and password!" & vbNewLine & vbNewLine + _
                   warning, MsgBoxStyle.Exclamation, "Soryy!" & _
                   "Now attempt var = " & attempt)
        ElseIf (Textuser.Text = "") Then
            attempt = attempt + 1
            MsgBox("Please input username!" & vbNewLine & vbNewLine + _
                   warning, MsgBoxStyle.Information, "Soryy!" & _
                   "Now attempt var = " & attempt)
        ElseIf (Textpassword.Text = "") Then
            attempt = attempt + 1
            MsgBox("Please input password!" & vbNewLine & vbNewLine + _
                   warning, MsgBoxStyle.Information, "Soryy ! " & _
                   "Now attempt = " & attempt)
        Else
            Dim strname = Textuser.Text
            Dim strpass = Textpassword.Text
            With objcon
                .Close()
                If .State = ConnectionState.Closed Then
                    .ConnectionString = strconnection
                    .Open()
                    ' MsgBox("connectionState.Open", MsgBoxStyle.Information, "Connected")
                End If
            End With
            ds.Clear()
            strSQL = "Select * From admin Where user_name='" & Textuser.Text & "' And password = '" & Textpassword.Text & "'"
            da = New OleDbDataAdapter(strSQL, objcon)
            da.Fill(ds, "admin")

            If ds.Tables("admin").Rows.Count <> 0 Then
                'play Sound
                My.Computer.Audio.Play(Application.StartupPath + "\Sound\kamal.wav")
                MaximizeBox = True
                MinimizeBox = True
                MsgBox("Log in Successful!", MsgBoxStyle.OkOnly, _
                       "Welcome " + strname)
                Form5.Show()
                Me.Visible = False
            Else
                MaximizeBox = False
                MinimizeBox = False
                attempt = attempt +
                    MsgBox("Ooop!" & strname & " _&_ " & strpass + vbNewLine + vbNewLine + _
                           "The username and password you entered" + vbNewLine + _
                           "Is not valid" + vbNewLine + _
                           "Please try again!", MsgBoxStyle.Exclamation, "Invalid")
            End If
        End If

        If attempt = 3 Then
            MsgBox("Windows is shutting down...", MsgBoxStyle.Critical, "Good bye!")
            Me.Close()
        End If

    End Sub

CHill60

Что плохого в том, что вы пробовали?

Richard Deeming

SQL-инъекция; хранение паролей в виде обычного текста; выбор всех столбцов из таблицы только для того, чтобы проверить, сколько строк было возвращено...

Я думаю, что лучше было бы спросить, что не что-то не так с кодом! :)

CHill60

О, я согласен. Я даже не стал утруждать себя анализом кода - я пытался заставить ОП объяснить, в чем их проблема, а не довольно утомительный сценарий "я не знаю, как это сделать, и это не в Google" .

1 Ответов

Рейтинг:
2

OriginalGriff

Не знаю, какие у тебя проблемы, но те, что я вижу, гораздо хуже.

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли? А на странице входа в систему? Это просто глупо, так как мне даже не нужно входить в систему, чтобы уничтожить вашу базу данных...


2) Никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - код на C#, но это довольно очевидно.

Исправьте их во всем вашем приложении, а затем начните беспокоиться о том, чтобы двигаться дальше - если вы этого не сделаете, то потеряете свою базу данных.