string checkuserQuery = "select username from usersign where Username=' " + TextBox1.Text + " ' ";
SqlCommand usercom = new SqlCommand(checkuserQuery, conn);
string user1 = string.Empty;
Object val = usercom.ExecuteScalar();
if (val != null)
{
user1 = val.ToString();
if (user1 == TextBox1.Text)
{
string checkpasswordQuery = "select password from usersign where Username=' " + TextBox1.Text + " ' ";
SqlCommand passcom = new SqlCommand(checkpasswordQuery, conn);
string password = passcom.ExecuteScalar().ToString();
if (password == TextBox2.Text)
{
Session["New"] = TextBox1.Text;
Label5.Text = "password is correct";
Response.Redirect("user.aspx");
}
else
{
Label5.Text = "password is not correct";
}
}
}
else
{
Label5.Text = "val is null";
}
}
答案 0 :(得分:1)
ExecuteScalar()
将返回null。
返回结果集中第一行的第一列,或返回null 如果结果集为空,则为引用(在Visual Basic中为Nothing。)
此行将抛出空引用异常:
passcom.ExecuteScalar().ToString();
使用字符串连接构建查询很容易出错。更重要的是,它易受SQL注入攻击。该代码表明密码以纯文本形式存储在数据库中。
SQL注入和纯文本密码是任何应用程序的一个严重问题。参数化您的查询(使用ADO.Net非常容易)并哈希密码。
缺少匹配可能是由以下行引起的:
string checkpasswordQuery = "select password from usersign where Username=' " + TextBox1.Text + " ' ";
请注意字符串连接中添加的额外空格。 TextBox1
中的任何内容都将以空格开头/后跟,导致匹配失败。
答案 1 :(得分:0)
问题可能是下面的空格字符(我把*放在空格中) 使用不当)
where Username='*" + TextBox1.Text + "*' "
因此,上述内容将意味着您的查询正在尝试获取具有的用户名 开头和结尾的空格字符,所以只需删除那些空格
另一点是,这种查询应该与参数一起使用,因为它很容易 SQL注入类型的攻击