颜色验证密码出错

本文关键字:出错 密码 验证 颜色 | 更新日期: 2023-09-27 17:57:39

我正在尝试创建颜色密码,但我收到了这个错误

用户代码未处理System.Data.SqlClient.SqlException"="附近的语法不正确。

我的代码是这样的,请帮帮我。。。。thnxx提前:)

protected void Button_Login_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
    conn.Open();
    string checkuser = "select count(*) from UserData where Username ='" + TextBoxUserName.Text + "'";
    SqlCommand com = new SqlCommand(checkuser, conn);
    int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
    conn.Close();
    if (temp == 1)
    {
        conn.Open();
        string checkPasswordQuery = "select Password from UserData where Username ='" + TextBoxUserName.Text + "'";
        SqlCommand passComm = new SqlCommand(checkPasswordQuery, conn);
        string password = passComm.ExecuteScalar().ToString().Replace(" ","");
        if (password == TextBoxPassword.Text)
        {
            Response.Write("Password is correct");

            string checkcolorQuery = "select Color1,Color2,Color3,Color4 from Username='" + TextBoxUserName.Text + "'";
            SqlCommand colorCom = new SqlCommand(checkcolorQuery, conn);
            string color = colorCom.ExecuteScalar().ToString(); // **getting error here**
            if (color == TextBoxColor1.Text && color == TextBoxColor2.Text && color == TextBoxColor3.Text && color == TextBoxColor4.Text) 
            {
              //  Session["New"] = TextBoxUserName.Text;
                Response.Write("Color Priority is correct");
                Response.Redirect("User.aspx");
            }
            else
            {
                Response.Write("Color Priority is  not correct");
            }
        }
        else
        {
            Response.Write("Password is  not correct");
        }

    }
  else
    {
        Response.Write("Username is not correct");
    }
}
}

颜色验证密码出错

您的查询当前为

select Color1,Color2,Color3,Color4 from Username='foo'

你肯定需要它像一样

select Color1,Color2,Color3,Color4 from tablename where Username='foo'

您还应该更改执行SQL的方式。使用类似的方法来执行SQL。

    public static void ExecuteSQL(string sqlCommand, Dictionary<string,object> parameters )
    {
        using (SqlConnection dbConn = new SqlConnection(GetConnectionString()))
        {
            dbConn.Open();
            using (SqlCommand dbCommand = new SqlCommand(sqlCommand, dbConn))
            {
                if (parameters != null)
                {
                    foreach (var parameter in parameters)
                    {
                        dbCommand.Parameters.AddWithValue(parameter.Key, parameter.Value);
                    }
                }
                dbCommand.ExecuteScalar();
            }
            dbConn.Close();
        }
    }

所以在你的代码中你只需要

 string checkuser = "select count(*) from UserData where Username =@username";
 var parameters = new Dictionary<string, object>();
 parameters.Add("@username", TextBoxUserName.Text);
 ExecuteSQL(checkuser, parameters);

问题#1

string checkcolorQuery = "select Color1,Color2,Color3,Color4 from Username='" + TextBoxUserName.Text + "'";

这是导致您出现错误的行。"from Username='hatever'"不是有效的SQL,可能(基于代码中的其他查询)您的意思是"from UserData where Username='hatever'。"。

问题#2

不过,当我们讨论这个主题时,这是一个SQL注入漏洞的教科书式例子,这也应该得到解决。考虑一下,如果有人在你的TextBoxUserName文本框中键入以下内容会发生什么:

';删除表UserData;--

重要:不要真的尝试这个,想想

问题#3

colorCom.ExecuteScalar().ToString();

ExecuteScalar()仅在需要单个值时使用。它在第一个查询中运行良好,因为返回的只是一个值(一行的密码字段的内容)。不过,在第二个查询中,您将返回四个值-仅从一行返回true,但您将选择四个字段(Color1到Color4)。

这里应该使用ExecuteReader(),它将返回一个数据读取器,您可以使用它来提取这四个值,然后将它们与用户的输入进行比较。

您的线路

string checkcolorQuery = "select Color1,Color2,Color3,Color4 from Username='" + TextBoxUserName.Text + "'";

就是问题所在。Username是列,而不是表。应该是

string checkcolorQuery = "select Color1,Color2,Color3,Color4 from UserData where Username='" + TextBoxUserName.Text + "'";