【问题标题】:Checking if username already exists within the databasae [closed]检查数据库中是否已经存在用户名[关闭]
【发布时间】:2013-02-27 17:23:04
【问题描述】:

我正在尝试检查数据库表“用户”以查看“用户名”是否存在,以便无法再次创建相同的用户名。我希望这是一个验证器,所以如果用户名存在,消息框将显示它存在。

请指导我完成此操作,到目前为止,我在按钮后面有以下代码来添加并检查用户名是否存在:

private void btnSignupNew_Click(object sender, EventArgs e)
        {

           if (txtUsername.Text == "")
           {
               errorUsername.SetError(txtUsername, "Enter A Username");
           }

           else if (txtPassword.Text == "")
           {
               errorPassword.SetError(txtPassword, "Enter A Valid Password");
           }

               //so if there isnt no error in the fields itll go on and add the data in to the database.
           else{

            //instance of sqlConnection
            SqlConnection con = new SqlConnection("Data Source=etc");

            //instance of sqlCommand
            SqlCommand cmd = new SqlCommand("INSERT INTO [User] values ('" + txtForename.Text + "', '" + txtSurname.Text + "', '" + txtUsername.Text + "', '" + txtPassword.Text + "' )", con);
            con.Open();
            cmd.ExecuteNonQuery();

            //query executed correcty or not
           con.Close();

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • 不要以纯文本形式存储密码
  • 使用parameterized queries 防止SQL 注入 攻击。
  • 我建议您查询用户表以查看用户名是否已经存在,但在此之前您应该在谷歌上搜索“sql 注入”并将查询参数化。
  • 看看 IF EXISTS in sql 是的,@SLaks 是对的,你有一个 SQL 注入漏洞,尽管这与你可能想知道的问题无关

标签: c# winforms visual-studio-2012 validation


【解决方案1】:

作为一个好习惯,尝试使用Parameters 保持您的持久性以避免SQL 注入。

试试类似这样的东西:

private void btnSignupNew_Click(object sender, EventArgs e)
{

   if (txtUsername.Text == "")
   {
       errorUsername.SetError(txtUsername, "Enter A Username");
   }
   else if (txtPassword.Text == "")
   {
       errorPassword.SetError(txtPassword, "Enter A Valid Password");
   }
   else
   {
        using (SqlConnection con = new SqlConnection("Data Source=etc")) 
        {
            con.Open();

            bool exists = false;

            // create a command to check if the username exists
            using (SqlCommand cmd = new SqlCommand("select count(*) from [User] where UserName = @UserName", con))
            {
                cmd.Parameters.AddWithValue("UserName", txtUsername.Text);
                exists = (int)cmd.ExecuteScalar() > 0;
            }

            // if exists, show a message error
            if (exists)
                errorPassword.SetError(txtUsername, "This username has been using by another user.");
            else 
            {
                            // does not exists, so, persist the user
                using (SqlCommand cmd = new SqlCommand("INSERT INTO [User] values (@Forname, @Surname, @Username, @Password)", con))
                {
                    cmd.Parameters.AddWithValue("Forname", txtForname.Text);
                    cmd.Parameters.AddWithValue("Surname", txtSurname.Text);
                    cmd.Parameters.AddWithValue("UserName", txtUsername.Text);
                    cmd.Parameters.AddWithValue("Password", txtPassword.Text);

                    cmd.ExecuteNonQuery();
                }               
            }

            con.Close();
        }   
    }
}

【讨论】:

  • 这行得通,谢谢!但是如果用户名存在我会遇到一个小问题,我会收到错误消息,但是当我单击“注册”按钮时,它会将我带回登录页面。知道如何扩散吗?谢谢。顺便说一句,我在底部的代码是: MessageBox.Show("Sucessfully Signed Up"); Form1 登录 = 新 Form1();登录.Show(); this.Close(); } }
  • 这只是他验证用户。你的问题听起来像是一个身份验证问题,它可能在另一个线程中以避免扩展这个问题。如果您要更改现有用户,则可以将查询更改为 ... Where UserName=@UserName And Id <> @Id" 之类的内容,以避免检查现有用户。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多