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注入,但他没有存储纯文本密码。