【问题标题】:I'm validating a form in C# but I don't know what I am doing wrong. Please help me solve this我正在验证 C# 中的表单,但我不知道我做错了什么。请帮我解决这个问题
【发布时间】:2021-08-24 08:49:42
【问题描述】:

我正在为来自数据库的表单数据创建验证,然后将其与在文本框中输入的数据进行比较。无论我在文本框中输入正确还是不正确的数据,它总是执行 else 部分,请帮助解决这个问题。

c.Uname = Text1.Value.ToString();
c.Cnic  = Text2.Value.ToString();
c.pass = Text3.Value.ToString();

SqlConnection sqlConn = new SqlConnection(@"Data Source=DESKTOP-Q4AAHCG;Initial Catalog=practise;User ID=;Password=;Trusted_Connection=True");

SqlCommand sqlComm = new SqlCommand("select Uname , Cnic, password from carregister", sqlConn);
sqlConn.Open();

SqlDataReader dr = sqlComm.ExecuteReader();

while (dr.Read())
{
    name = dr["Uname"].ToString();
    cnic = dr["Cnic"].ToString();
    passs = dr["password"].ToString();

    if (name.Equals(c.Uname) && cnic.Equals(c.Cnic) && passs.Equals(c.pass))
    {
        Session["Uname"] = Text1.Value.ToString();
        Session["cnic"] = Text2.Value.ToString();

        Response.Redirect("Carloby.aspx");
    }
    else 
    {
        Response.Redirect("wrongidpass.aspx");
    }
}

【问题讨论】:

  • 使用调试器检查 Uname、Cnic 和 pass 的运行时值。如果数据库中有多个用户,则此逻辑将不起作用。您只想从数据库中获取与用户名匹配的一条记录,或者将 else 块的内容移到循环之外(当没有匹配时,错误的idpass)。
  • 从不将密码存储为纯文本!哈希他们!另外:我建议您想象一下,如果您的数据库中有 两行,并且您尝试使用 第二行 行的凭据登录会发生什么。运行你头脑中的代码,和/或调试器。
  • 您应该在查询中有WHERE 子句,以根据用户输入的用户名获取用户的详细信息。如果找到用户,那么只有您应该比较密码。如果未找到用户或密码不匹配,则应重定向到 workingpass.aspx。

标签: c# asp.net-mvc validation


【解决方案1】:

您正在读取用户表的所有行并开始与收到的第一行进行比较。如果这不匹配,您已经在重定向...

您可以只计算数据库中匹配的行,如果返回 1 以外的任何内容,则用户名或密码(或您的数据库)存在错误。

c.Uname = Text1.Value.ToString();
c.Cnic  = Text2.Value.ToString();
//you don't store plaintext passwords in your db, do you?
c.pass = hash_the_password(Text3.Value.ToString());  

SqlConnection sqlConn = new SqlConnection(@"Data Source=DESKTOP-Q4AAHCG;Initial Catalog=practise;User ID=;Password=;Trusted_Connection=True");

SqlCommand sqlComm = new SqlCommand("SELECT COUNT(*) FROM carregister WHERE uname = @uname and cnic = @cnic and password = @hashedpassword", sqlConn);
sqlComm.Parameters.Add("@uname", SqlDbType.NVarchar).Value = c.Uname;
sqlComm.Parameters.Add("@cnic", SqlDbType.NVarchar).Value = c.Cnic;
sqlComm.Parameters.Add("@hashedpassword", SqlDbType.NVarchar).Value = c.pass;
sqlConn.Open();

if (Convert.ToInt32(sqlComm.ExecuteScalar()) == 1) {
  //you have exactly one row where uname, cnic and password match the entered values
    Session["Uname"] = Text1.Value.ToString();
    Session["cnic"] = Text2.Value.ToString();

    Response.Redirect("Carloby.aspx");
}
else 
{
    //no row matched 
    //(or more than one which is an error in the database, because uname should probably be unique)
    Response.Redirect("wrongidpass.aspx");
}

【讨论】:

  • 是的,兄弟我以纯文本形式存储了密码。您的回答对我帮助很大,现在我更容易理解我做错了什么。非常感谢,兄弟。
  • 请不要以明文形式存储密码!甚至对于您自己的演示项目也不行...
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2014-02-16
  • 1970-01-01
相关资源
最近更新 更多