-3

登録ページがあり、ユーザー名がデータベースに既に存在するか、3 層アーキテクチャに存在しないかを確認したい。

MyRegistration.cs:

public static int checkusername(string user_txt)
 {
  int id2 = 0;
  string selectstr = "select * from xyz where UserName = '" + user_txt + " ' ";
  id2 = DataAccessLayer.ExecuteReader(selectstr);
  return id2;    
 }

およびtextbox の onclick イベントの背後にあるコード:

protected void txt_username_TextChanged(object sender, EventArgs e)
 {
  if (!string.IsNullOrEmpty(txt_username.Text))
   {
    int id = xyz.checkusername(txt_username.Text.Trim());
    if (id > 0)
     {
      lblStatus.Text = "UserName Already Taken";
     }
    else
     {
      lblStatus.Text = "UserName Available";
     }
   } 

 }

データアクセス層:

public static int ExecuteReader(string Query)
 {
  SqlConnection con = new SqlConnection();
  con.ConnectionString = GetConnectionString();
  con.Open();
  int id = 0;            
  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = Query;
  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;
 }
4

3 に答える 3

2

私はあなたのコードのいくつかを以下のように編集しました...それはあなたを助けます...

テキスト変更イベント:

    protected void txt_username_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(txt_username.Text))
        {
            if (xyz.checkusername(txt_username.Text.Trim()))
            {
                lblStatus.Text = "UserName Already Taken";
            }
            else
            {
                lblStatus.Text = "UserName Available";
            }
        }

    }

ユーザー名を確認してください:

    public bool CheckUsername(string user_txt)
    {
        bool Result;
        Result = DataAccessLayer.ExecuteReader(user_txt);
        return Result;
    }

実行リーダー:

    public bool ExecuteReader(string user_txt)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = GetConnectionString();
        con.Open();
        SqlCommand cmd = new SqlCommand("select * from xyz where UserName = @UserID", con);
        SqlParameter param = new SqlParameter();
        param.ParameterName = "@UserID";
        param.Value = user_txt;
        cmd.Parameters.Add(param);
        SqlDataReader reader = cmd.ExecuteReader();
        if (reader.HasRows)
            return true;
        else
            return false;
    }
于 2013-04-09T10:34:10.617 に答える
2

通常、「選択クエリ」でパラメータ user_txt を持つ userName が見つからない場合、id2 の値は -1 になります。したがって、適切なコードは次のようになります。

           if (id ==-1)
               {
                   lblStatus.Text = "UserName Available";
               }
           if (id>0)
               {

                   lblStatus.Text = "UserName Already Taken";
               }

ところで、コードは非常に安全ではなく、データベースはSQL インジェクションを使用して簡単に攻撃される可能性があります。この問題を理解し、それを防ぐためにクエリにパラメーターを追加することをお勧めします。C# には、これを実装する独自の方法があります。データベースへのアクセスを修正しようとしないでください。SQL インジェクションを念頭に置いて、ゼロから始めてください。

于 2013-04-09T10:04:30.240 に答える
0

他の人が述べたように、このアプローチには潜在的に深刻なセキュリティ上の問題があります。

ただし、問題はここにある可能性がありますuser_txt + " ' "。2 番目の の前後のスペース'、特にその前のスペースは、ユーザー名が期待どおりに一致しない可能性があります。

于 2013-04-09T10:04:06.367 に答える