0

テーブルuser_infoが作成され、2つのユーザー名とパスワードが含まれています。以下のコードを実行すると、正しいユーザー名とパスワードを入力しても、常に「else」状態になります。

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
    con = new OracleConnection(v);
    con.Open();

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
    dr = cmd.ExecuteReader();
    dr.Read();
    if (dr.HasRows)
    {
        Response.Redirect("Default2.aspx");
    }
    else
    {
        Response.Redirect("Default.aspx");
    }


    con.Close();
    dr.Close();
}
4

2 に答える 2

1

dr には行がないため、else に入ります。理由を調べるには、ブレークポイントを配置します

dr = cmd.ExecuteReader();

次に、パラメーターを指定して実際に sql select コマンドを実行し、これを db に対して sql ステートメントとして実行して、行が返されるかどうかを確認します。私の疑いは、Login1.Username および/または Login1.Password をフィードしていると思われるものは何も渡していないが、Login1 がどのように入力されているかを知らずに言うのは難しいということです。

ところで、これらが Web ページのテキスト ボックスである場合、Login1.Username.Text と Login1.Password.Text を使用して、テキスト ボックスにある実際の文字列を取得する必要があります。

于 2012-06-07T17:51:59.410 に答える
0

まず最初に、少なくともパスワードをハッシュする必要があります。また、接続をクラス レベルのままにしないことをお勧めします。それらを使用するときは、作成し、開いて、閉じる必要があります。コマンド、リーダーなどと同じ...これは、 usingブロックで非常に簡単に実行できます。

次に、Login1.UserName と Login1.Password を使用するときに、コントロールではなく実際の文字列値にアクセスしていることを確認します。コントロールを使用している場合は、Login1.UserName.Text.Trim() および Login1.Password.Text.Trim() を使用する必要があります。これは、作成したクエリをローカル文字列値に保存し、実際に作成されたものを確認することで確認できます。

あなたがしていることに DataReader を使用しないでください。代わりに ExecuteScalar メソッドを使用します。

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
    con = new OracleConnection(v);
    con.Open();

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
    int count = Convert.ToInt32(cmd.ExecuteScalar());
    if (count > 0)
    {
        Response.Redirect("Default2.aspx");
    }
    else
    {
        Response.Redirect("Default.aspx");
    }

    con.Close();
}

この設定が完了したら、 if (count > 0)行にブレークポイントを設定します。ローカル変数に保存されているクエリを確認し、カウントを確認してください。これにより、必要なものがすべて提供されます。

于 2012-06-07T18:08:28.500 に答える