0

ユーザーが存在するかどうかを確認しようとします。

public static bool GetUser(string tblName, string UserName,string Password,string Usertype)
        {
            try
            {

                using (SqlConnection con = Connection.GetConnection())
                {
                    using (SqlCommand cmd = con.CreateCommand())
                    {
                       cmd.CommandText = "select count(UserName) from " + tblName + " where Password=" + Password + " and usertype=" + Usertype + " and username="+ UserName + "";
                        object obj = cmd.ExecuteScalar();
                        if (obj != null)
                            return true;
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

このメソッドを呼び出すと、次のエラーが発生しました。
私のエラー
接続が正常に確立され、このメソッドを次のように呼び出します。

bool Check = UserLogin.GetUser("OnlineCertificationLogin", "admin", "admin", "Admin");

私のテーブル構造は

私のテーブル構造
間違いが見つかりません。ありがとうございます。

4

4 に答える 4

6

値を引用していないため、SQL は次のようになります。

select count(UserName) from OnlineCertificationLogin
where Password=admin and usertype=admin and username=Admin

引用符を追加してこれを修正しないでください。コードは指定されたサンプルで機能しますが、 SQL インジェクション攻撃に対して脆弱になります。代わりに、パラメーター化されたクエリを使用してこれを修正する必要がありますSqlCommand.Parameters。詳細と例については、を参照してください。

テーブル名をパラメーター化することはできませんが、ユーザー入力などではなく、信頼できるコードを介してのみ取得するようにする必要があります。そうしないと、まったく同じ SQL インジェクションの問題が再び発生します。

そのような平文でパスワードを保存するべきではないことに注意してください。

セキュリティに関する本を手に入れることを強くお勧めします。(私はコピーを持っていますが、正直あまり読んだことがありません。Barry がセキュリティについて話しているのを聞いたことがあります。彼はそれをすべて非常に明確に説明しています。)

于 2012-05-13T07:37:41.357 に答える
1

final への文字列値の注入がすべてだと思いますSQL query

単純な文字列連結を使用しないでください。ただし、 SqlParameterを使用してクエリに値を挿入すると、問題が解決される可能性が高くなります。

于 2012-05-13T07:35:46.087 に答える
0
cmd.CommandText = "select count(UserName) from " + tblName + " where Password='" + Password + "' and usertype='" + Usertype + "' and username='"+ UserName + "'";

これを試してみてください。' についての問題だと思います。

于 2012-05-15T15:00:02.083 に答える
0

パラメータをエスケープする必要があります。

さらに、そのような直接の SQL コマンドを使用するべきではなく、SQL パラメーター化を使用する必要があります。

            using (SqlConnection con = Connection.GetConnection())
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = @"SELECT count(UserName) FROM" + tblName +
                    " WHERE Password=@pPass AND usertype=@pUsertype AND
                    username=@pUsername";
                    cmd.Parameters.Add("@pUsername", SqlDbType.VarChar);
                    cmd.Parameters.Add("@pPass", SqlDbType.VarChar);
                    cmd.Parameters.Add("@pUsertype", SqlDbType.VarChar);
                    cmd.Parameters["pUsername"] = UserName;
                    cmd.Parameters["pPass"] = Password;
                    cmd.Parameters["pUsertype"] = Usertype;
                    object obj = cmd.ExecuteScalar();
                    if (obj != null)
                        return true;
                    return false;
                }
            }
于 2012-05-13T07:40:25.047 に答える