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

时间:2012-01-08 10:54:27

标签: 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 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();

感谢帮助者!

5 个答案:

答案 0 :(得分:2)

您的代码看起来应该可以正常工作。您是否已逐步完成并在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等,请使用参数化查询。

答案 1 :(得分:0)

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

创建的SqlDataReader
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];
}

ExecuteReader SqlDataReader

答案 2 :(得分:0)

您是否尝试过Response.Write查询字符串,然后将结果粘贴到数据库资源管理器中的新查询中?你可能会感到惊讶:)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

很少有事情要检查:

  1. 您要发送的用户名/密码值的大小写(上/下);可能由于不区分大小写,它不匹配任何东西。

  2. 您是否以纯文本格式存储密码...通常密码会以加密方式存储...所以我建议您只搜索用户名

    SELECT Username,Password FROM Users WHERE lower(Username)='Username';