颜色验证密码出错
本文关键字:出错 密码 验证 颜色 | 更新日期: 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 + "'";