-4

ビジネス アクセス層:

    public static int login(string userlogin, string pwdlogin)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = GetConnectionString();
        con.Open();
        int id = 0;
        string selectstr = "SELECT UserName, Password FROM Registration WHERE UserName = '" + userlogin.Trim() + "' AND Password = '" + pwdlogin.Trim() + "'";
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = selectstr;
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.Connection = con;
        id = cmd.ExecuteNonQuery();
        cmd = null;
        con.Close();
        return id;
    }

ログイン.cs

 protected void Button1_Click(object sender, EventArgs e)
    {
        int id = BusinessAccessLayer.login(userlogin.Text.Trim(), pwdlogin.Text.Trim());
        if (id > 0)
        {
            message.Text = " valid";
        }
        else
        {
            message.Text = "in valid";
        }   
    }
4

3 に答える 3

6

さて、ここには複数の問題があります。

1)using例外がスローされた場合でも、ステートメントを使用して、接続とコマンドを確実に閉じる必要があります

2) SQL インジェクション攻撃を避けるために、値を直接 SQL ステートメントに入れるのではなく、パラメーター化された SQL を使用する必要があります。

3) パスワードを平文で保存しているようです。そうしないでください。ソルトハッシュまたは類似のものを使用します (理想的には計算が遅いもの)。

4) .NET 命名規則を無視しています。メソッドは PascalCase にする必要があります

5) SQL は、ユーザー ID に関連していると思われるフィールドを調べません。何ExecuteNonQueryを返すかは明確ではありませんが、実際の ID が必要な場合は、SQL でそれを参照する必要があります。(最初はユーザーのパスワードが有効かどうかを知りたいだけだとしても、ある時点で実際のユーザー ID を使用したいと強く思うので、コードでそれを返すようにする必要がありますパスワードが有効かどうかを確認するには、メソッドの戻り値の型を に変更する必要がありますbool。)

6)ExecuteNonQueryコマンドが明らかにクエリである場合に使用しています。ExecuteReaderまたはExecuteScalar代わりに使用します。(ExecuteNonQueryは挿入、削除、および更新ステートメント用であり、コマンドの影響を受けた行数を返します。)

次のようなものです:

public static int Login(string user, string password)
{
    using (var conn = new SqlConnection(GetConnectionString()))
    {
        conn.Open();
        string sql = "select Id, PasswordHash from logins where Username=@Username";
        using (var command = new SqlCommand(sql))
        {
            command.Parameters.Add("@Username", SqlDbType.NVarChar).Value = user;

            using (var reader = command.ExecuteRead())
            {
                if (reader.Read())
                {
                    int id = reader.GetInt32(0);
                    string hash = reader.GetString(1);
                    // TODO: Hash provided password with the same salt and compare
                    // results
                    if (CheckPassword(password, hash))
                    {
                        return id;
                    }
                }
                return 0; // Or use an int? return type and return null
            }
        }
    }
}
于 2013-03-11T07:01:20.007 に答える
0

結果が必要な場合は、.ExecuteNonQuery を使用できません。.ExecuteReader を使用します。

public static int login(string userlogin, string pwdlogin)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = GetConnectionString();
    con.Open();
    int id = 0;
    string selectstr = "SELECT UserId FROM Registration WHERE UserName = '" +    userlogin.Trim() + "' AND Password = '" + pwdlogin.Trim() + "'";
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = selectstr;
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.Connection = con;

    SqlDataReader reader = cmd.ExecuteReader();
    reader.Read();
    id = reader.GetInt32("UserId");

    reader.Close();
    con.Close();

    return id;
}
于 2013-03-11T07:00:01.557 に答える
0

ExecuteNonQueryは、UPDATE、INSERT、および DELETE ステートメントに使用されます。SELECT ステートメントの場合は、ExecuteReaderを使用します

public static int login(string userlogin, string pwdlogin)
{
        SqlConnection con = new SqlConnection();
        con.ConnectionString = GetConnectionString();
        con.Open();
        int id = 0;
        string selectstr = "SELECT UserName, Password FROM Registration WHERE UserName = '" + userlogin.Trim() + "' AND Password = '" + pwdlogin.Trim() + "'";
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = selectstr;
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.Connection = con;
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
               id++; 
        }
        cmd = null;
        reader.Close();
        con.Close();
        return id;
}
于 2013-03-11T07:02:44.347 に答える