C# 用户名和密码总是错误的,即使它们在数据库中为真

C# 用户名和密码总是错误的,即使它们在数据库中为真,c#,asp.net,sql-server,security,password-protection,C#,Asp.net,Sql Server,Security,Password Protection,我试图建立一个登录网页,由于某些原因,它总是进入“假”行,其中登录和密码是不正确的。我查了一下数据库,想知道我可能是个傻瓜,但这完全是真的 这是我的代码: con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True"); string query = "SELECT Username, Password FROM Users

我试图建立一个登录网页,由于某些原因,它总是进入“假”行,其中登录和密码是不正确的。我查了一下数据库,想知道我可能是个傻瓜,但这完全是真的

这是我的代码:

con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True");
string query = "SELECT Username, Password FROM Users WHERE Username='" + Username + "' AND Password='" + Password + "'";
con.Open();
DataSet ds = new DataSet();
SqlDataAdapter adap = new SqlDataAdapter(query, con);
adap.Fill(ds);
int count = ds.Tables[0].Rows.Count;
if (count == 0)
{
    ErrorMessege.Text = "Username or Password was Incorrect!";
}
else
{
    Session["Session"] = UsernameLogin.Text;
    Response.Redirect("MenuHome.aspx");
}
con.Close();

谢谢你的帮助

检查密码最简单的方法就是创建一个从

SqlCommand sqlCommand = new SqlCommand(queryString, connection);
var reader = sqlCommand.ExecuteDataReader();
if(reader.Read()){
 //you got a correct password, read fields from reader
   string username = reader[0];
}

您是否尝试响应。写入查询字符串,然后将结果粘贴到数据库资源管理器中的新查询中?您可能会感到惊讶:)

请确保用户名和密码验证不区分大小写,或者使用正确的大小写进行验证。如果数据库使用区分大小写的排序规则,它可能不会返回您期望的结果。

您的代码看起来应该可以正常工作。你有没有在ds上添加一块手表,看看它有什么价值?我在我的机器上针对我的一个测试数据库执行了代码,它运行良好

不过,我想提出一些与此类似的建议,因为在我看来,这要干净得多:

using(SqlConnection con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True"))
{
    string query = "SELECT TOP 1 Username FROM Users WHERE Username=@UserName AND Password=@Password";

    using (SqlCommand command = new SqlCommand(query, con))
    {
        command.Parameters.AddWithValue("@UserName", UserName);
        command.Parameters.AddWithValue("@Password", Password);
        con.Open();
        string username = (string)command.ExecuteScalar(); //Add Null Check
        // Do stuff if username exists         
    }
}
您应该始终在实现IDisposable的对象上添加using语句。(SqlConnection、SqlCommand)此外,为了防止SqlInjection等,请使用参数化查询。

需要检查的事项如下:

  • 您发送的用户名/密码值的大小写(大写/小写);可能是因为不区分大小写,所以不匹配

  • 您正在以纯文本格式存储密码。。。通常密码会被加密存储。。。所以我建议你只搜索用户名,比如

    从用户中选择用户名、密码,其中较低的(用户名)=‘用户名’


  • 使用
    SqlParameter
    s将用户名和密码值传递给查询!您当前的实现要求SQL注入!(例如,试着输入
    x'和1=1--
    作为用户名和密码的一些随机值,看看会发生什么)为什么不使用内置的asp.net sql成员资格提供程序?我想成为用户
    'x';删除表用户将密码存储在清除模式中?我不想订阅你的登录系统。默认的AspNet成员资格提供程序有什么问题?滚动您自己的登录系统似乎是一种巨大的时间浪费,也是一种引入安全问题的好方法。粗略地看一眼你的代码就会发现两个严重的问题(至少)我确保它的编写方式与数据库中的一样。挑剔:你不加密密码,而是对密码进行散列。他仍然需要修复密码存储。您修复了sql注入,但他没有存储纯文本密码。