0

私はプロジェクトを書いていますが、ある時点で、 と の内容に一致するエントリがデータベースにあるかどうかを確認する必要がありid-textboxますpassword-textbox。しかし、クエリが何も返さないことをバックエンド コード (VB) で示す方法がわかりません。

これは私が使用しているコードです。しかし、それはどういうわけか機能しません。エラーメッセージが表示されません:

Try
    myconn.Open()
    Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = " & IdNumb.Text
    Dim smd As MySqlCommand
    Dim myreader As MySqlDataReader
    smd = New MySqlCommand(stquery, myconn)
    myreader = smd.ExecuteReader()
    If myreader.Read() = True Then
        If myreader.Item("user_ID") = IdNumb.Text Then
            If myreader.Item("password") = CurrPass.Text Then
                'some code if the user input is valid
             Else
                errorPassID.Visible = True
             End If
        Else
           errorPassC.Visible = True
        End If
    End If
    myconn.Close()
Catch ex As Exception
    Dim ErrorMessage As String = "alert('" & ex.Message.ToString() & "');"
    Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True)   myconn.Close()
End Try

助けや提案をいただければ幸いです。

4

1 に答える 1

0

リーダーが行を返すかどうかを確認し、そうでない場合はエラー メッセージを出力します。また、文字列連結を使用してクエリを作成しないでください。常にパラメータ化されたクエリを使用してください。

        myconn.Open()
        Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = @id"
        Dim smd = New MySqlCommand(stquery, myconn)
        smd.Parameters.AddWithValue("@id", Convert.ToInt32(IdNumb.Text))
        Dim myreader = smd.ExecuteReader()
        if Not myreader.HasRows Then
            Dim ErrorMessage As String = "alert('No user found');"
            Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True)
            myconn.Close()
            return
        else
            myreder.Read()
            ' no need to check if id is equal, you pass it as parameter to a where clause'
            If myreader.Item("password") = CurrPass.Text Then
                 'some code if the user input is valid '
            Else
                 errorPassID.Visible = True
                  ' or error message '
            End If
        End If
        myconn.Close()
    Catch ex As Exception
        Dim ErrorMessage As String = "alert('" & ex.Message.ToString() & "');"
        Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True)
        myconn.Close()
    End Try

また、クリア テキストのパスワードをネットワーク上で渡すことは、重大なセキュリティ ホールになることにも注意してください。パスワードのハッシュを保存し、代わりにそれを確認していただければ幸いです。

ところで、クエリでパスワード ハッシュも渡してはどうでしょうか。このようなもの:

  Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = @id AND password = @pwd"

このようにして、返されたレコードがある場合、ユーザーは検証され、クライアント側のコードは単純になります

于 2013-05-02T07:34:14.317 に答える