0

コードの何が問題なのか、コードから誰か教えてもらえますか?

ユーザー名とパスワードが一致しない場合、lbl テキストには「ユーザー名/パスワードが正しくありません」と表示されます。

コード:

Protected Sub btnLogin_Click(sender As Object, e As System.EventArgs) Handles btnLogin.Click

        Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Brian\Documents\Visual Studio 2010\WebSites\PetLandia\App_Data\db.mdb")
        Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [User] where Username=? and Password=?", conn)

        cmd.Parameters.AddWithValue("@Username", txtLogin.Text)
        cmd.Parameters.AddWithValue("@Password", txtPassword.Text)




        If (String.IsNullOrEmpty(txtLogin.Text)) Or (String.IsNullOrEmpty(txtPassword.Text)) Then

            lblLoginError.Text = "One or more fields are empty. Please fill in all the fields"
            lblLoginError.Visible = True

        Else

            conn.Open()
            Dim read As OleDbDataReader = cmd.ExecuteReader()

            Try

                If read.HasRows Then

                    While read.Read()

                        If txtLogin.Text = read.Item("username").ToString And txtPassword.Text = read.Item("password").ToString Then


                            Dim tUsername As String = read.Item("Username").ToString

                            Session("Username") = tUsername
                            Response.Redirect("Default.aspx")


                        End If
                    End While
                End If

                read.Close()
            Catch ex As Exception
                Response.Write(ex.Message())
                lblLoginError.Text = "Incorrect Username/Password."
                lblLoginError.Visible = True

            Finally
                conn.Close()
            End Try


        End If

    End Sub
4

5 に答える 5

2

if ステートメントにcatchan を書き込む代わりにElse

于 2012-05-05T18:18:20.967 に答える
0
  1. あなたは自分のセキュリティをロールバックすることに決めました...
  2. パスワードをプレーン テキストで保存しているように見えますが、これは巨大なセキュリティ ホールであり、法的責任を負う可能性があります。
  3. If read.HasRows渡されたユーザー名とパスワードがデータベースに存在しない場合は false になります。つまり、例外はスローされず、単に行が返されません。
  4. Dispose使い捨てオブジェクトを呼び出しませんでした。
  5. 結果が 0 よりも大きいかどうかを確認するために単にExecuteScalarwithを呼び出す方が高速です。Select Count(*)

Dim authenticationFailed As Boolean = String.IsNullOrEmpty(txtLogin.Text) _ 
    OrElse String.IsNullOrEmpty(txtPassword.Text)

If Not authenticationFailed Then
    Dim connString = "Provider=Microsoft.Jet.OLEDB.4.0..."
    Using conn = New OleDbConnection(connString)
        Const sql As String = "Select Count(*) From [User] Where Username=? and Password=?"
        conn.Open()
        Using cmd = New OleDbCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Username", txtLogin.Text)
            cmd.Parameters.AddWithValue("@Password", txtPassword.Text)

            Try
                Dim result = cmd.ExecuteScalar(CommandBehavior.CloseConnection)
            Catch generatedExceptionName As SqlException
                authenticationFailed = True
            End Try

            authenticationFailed = authenticationFailed _ 
                OrElse Convert.ToInt32(result) <> 1

            If Not authenticationFailed Then
                Session("Username") = txtLogin.Text
            End If
        End Using

        conn.Close()
    End Using
End If

If authenticationFailed Then
    lblLoginError.Text = "Incorrect username and password"
    lblLoginError.Visible = True
End If
于 2012-05-05T18:51:02.363 に答える
0

あなたが書いたように、「間違ったユーザー名/パスワード」は、例外がスローされた場合にのみ表示されます。

コードをそのまま使用する場合は、ELSE を追加します。

If txtLogin.Text = read.Item("username").ToString And txtPassword.Text = read.Item("password").ToString Then


                        Dim tUsername As String = read.Item("Username").ToString

                        Session("Username") = tUsername
                        Response.Redirect("Default.aspx")
else
throw new exception("Incorrect Username/Password")
End If
于 2012-05-05T18:20:57.767 に答える