-5

Visual Studio 2012 の ASP.NET C# で選択クエリを使用してログイン認証のコードを作成しました。部分的なコードは次のとおりです。

String conn = "Data Source=Srinidhi-PC\\sqlexpress;Initial Catalog=model;Integrated Security=True";
    SqlConnection con = new SqlConnection(conn);
    con.Open();
    String query ="select * FROM [original] WHERE firstname='" + TextBox1.Text + "' and password='" + TextBox2.Text + "'"; 
    SqlCommand cmd = new SqlCommand(query,con);
    SqlDataReader reader =  cmd.ExecuteReader();
    if (reader.HasRows == true)
        Response.Redirect("redirectpage.aspx");
    else
        Response.Write("Login Failure");

しかし、毎回、システムは「ログイン失敗」しか応答しません。ここでの問題は何ですか?

ExecudeReader条件に一致するレコードを返します。クエリに関する限り、練習用に書きました。元のコードにパラメーターを追加します。

4

2 に答える 2

2

ここでは多くのことが起こっています。解きほぐすのは難しいです。

最も重要なことは、誰か';(drop table [original])が TextBox1 に入力した場合はどうなるでしょうか? これはSql インジェクションと呼ばれます。これは悪いことです。プログラマーになることを学んでいる場合は、それが何であるか、およびそれを回避する方法を学ぶ必要があります。

幸いなことに、これは解決された問題であり、ウェブ全体で情報を見つけることができます。SO: SQL インジェクション攻撃の防止: どこから始めればよいでしょうか。

クラシック XKCDhttp://xkcd.com/327/ から

次に、reader.HasRows == falseログインに失敗したという意味でない場合は、クエリが 0 行を返したことを意味します。ログインできなかった場合、 への呼び出しcon.Open()で例外がスローされるため、問題は実際にはクエリがデータを返さないことです。

また、リダイレクトを実行するために行をカウントするだけの場合は、countより高速に実行され、サーバー リソースの使用量が少ないクエリを使用することをお勧めします。

于 2013-08-07T02:16:22.170 に答える