1

ソースコード:

SqlConnection con = new SqlConnection("Data Source=ANIRUDH;Initial Catalog=DB1;Integrated Security=True");
con.Open();

protected void Login_Click(object sender, EventArgs e)
{
    SqlCommand cmd = new SqlCommand("SELECT * FROM USER_LOGIN WHERE USERID='" + txtUserName.Text + "' AND PASSWORD='" + txtPassword.Text + "'", con);
    SqlDataReader dr = cmd.ExecuteReader();

    string userid = txtUserName.Text;
    string password = txtPassword.Text;
    dr.Read();

    if((dr["USERID"].ToString() == userid) && (dr["PASSWORD"].ToString() == password))
    {
        Response.Redirect("/WebForm1.aspx", true);
    }
    else
    { 
        Response.Write("Invalid");
    }

}

問題:

これは常に...データベースにあるように正しいユーザー名とパスワードを入力しているとき...データベースからの値を示すためにLABELを使用したとき...それらは正しく表示されています...しかし、常にINVALIDを表示している比較中

4

1 に答える 1

0

人々がコメントで行っているすべての通常の SQL インジェクションなどに加えて、実際には 2 回テストしています。あなたがやっていることを非難するのではなく、私はそれがうまくいかない「理由」を助けようとします.

最初に、ユーザーとパスワードが同じ入力である行を選択してから、データリーダーの内容をテストしています。

それよりも、データリーダーに実際に何かが含まれているかどうかを確認してください。そうでない場合は、選択に基づいて何も選択されていないため、ユーザーとパスワードが正しくありません。

シンプルdr.HasRowsは、リーダーに何かが含まれているかどうかを知らせます。

確かに、これは SQL が何も選択しない理由を解決しない可能性があります。

あなたを捕まえるかもしれないことの1つは、大文字と小文字の区別です。(dr["USERID"].ToString() == userid文字列「a」は文字列「A」と等しくないため、大文字と小文字の区別が重要になります。

アップデート

HasRows に関して私が何を意味するかを示すために、代わりにこれを試してくださいif。後ですべての追加ステートメントは必要ありません。SQL がwhere句を含む行を見つけられなかった場合、ユーザーとパスワードの組み合わせを含む行が存在しないことは明らかです。

    SqlCommand cmd = new SqlCommand("SELECT * FROM USER_LOGIN WHERE USERID='" + txtUserName.Text + "' AND PASSWORD='" + txtPassword.Text + "'", con);
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.HasRows){
          Response.Redirect("/WebForm1.aspx", true);
    }else{
          Response.Write("Invalid");
    }
于 2013-05-01T18:24:04.613 に答える