C# ASP.NET登录,密码无效
错误:FROM子句中的语法错误 “用户代码未处理OLEDBEException。”C# ASP.NET登录,密码无效,c#,asp.net,sql,C#,Asp.net,Sql,错误:FROM子句中的语法错误 “用户代码未处理OLEDBEException。” 谢谢。首先,它构建并不意味着它是正确的 其次,您的代码容易受到SQL注入的攻击 第三,如果没有错误信息或意图,我们就无法判断出哪里出了问题 最后但并非最不重要的一点:只有当通过查询获得的第一列的第一行返回值1时,代码才会工作。我不知道你在做什么,但如果其他一切都对你有效,你可能想检查一下。你可以简单地按以下方式操作: con.Open(); string mysql; // generate an
谢谢。首先,它构建并不意味着它是正确的 其次,您的代码容易受到SQL注入的攻击 第三,如果没有错误信息或意图,我们就无法判断出哪里出了问题
最后但并非最不重要的一点:只有当通过查询获得的第一列的第一行返回值1时,代码才会工作。我不知道你在做什么,但如果其他一切都对你有效,你可能想检查一下。你可以简单地按以下方式操作:
con.Open();
string mysql; // generate an sql insert query for the database
mysql = "SELECT 1 FROM [Users] WHERE Username=? AND Password=?";
OleDbCommand cmd = new OleDbCommand(mysql, con);
cmd.Parameters.AddWithValue("@p1", tbUser.Text);
cmd.Parameters.AddWithValue("@p2", tbPass.Text);
cmd.ExecuteNonQuery();
int temp = Convert.ToInt32(cmd.ExecuteScalar().ToString());
if(temp==1)
{
Session["LogIn"] = lblUser.Text;
lblLogin.Text = "Welcome " + lblUser.Text + ", you are now logged in.";
}
else
{
lblLogin.Text = "Invalid Username/Password!";
}
con.Close();
编辑
现在我仔细看看,这段代码有很多错误。标准做法是一次性检查用户名/密码组合:
con.Open();
string mysql; // generate an sql insert query for the database
mysql = "SELECT 1 FROM [Users] UserName='" + tbUser.Text + "' AND
Password='"+ tbPass.Text+"'";
OleDbCommand CheckUser = new OleDbCommand(mysql, con);
int temp = Convert.ToInt32(CheckUser.ExecuteScalar());
if(temp==1)
{
//Login
}
else
{
//Invalid UserName or Password.
}
以及使用用户名和密码值向命令添加参数。这样,黑客在不知道密码的情况下无法确定有效的用户名
该区块:
mysql = "SELECT 1 FROM [User] WHERE UserName=? AND Password=?";
OleDbCommand CheckUser = new OleDbCommand(mysql, con);
// Add OleDbParameters here with the correct type/length
CheckUser.Parameters.Add("@userName", OleDbType.Char, 20).Value = tbUser.Text ;
CheckUser.Parameters.Add("@password", OleDbType.Char, 20).Value = tbPass.Text ;
int temp = Convert.ToInt32(CheckUser.ExecuteScalar().ToString());
将从结果集的第一行返回第一列。除非Password
是User
表中的第一列,否则您不会得到密码,而是得到其他值
它可以是:
mysql2 = "SELECT * FROM [User] WHERE Password='" + tbPass.Text + "'";
OleDbCommand Pass = new OleDbCommand(mysql2, con);
string Password = Pass.ExecuteScalar().ToString();
请使用SQL参数1)参数化查询。2) 散列您的密码。阅读SQL注入,阅读不存储纯文本密码,阅读会员资格提供程序,简而言之,获取一本关于ASP的好书。NETvisual studio附带了一个非常好的调试器,为什么不逐条检查代码?您不应该给出一条消息“密码错误”,因为它会给潜在的黑客一个信号“所以我猜对了用户名“如果一些用户使用相同的密码,它会变得有趣:-)@ChristopherDunne,我认为这更重要,因为它会让你在路上省去心痛。如果你在一家大公司用这种代码编写代码,而一个黑客用这种代码闯入一个系统,造成数千美元/英镑/你最喜欢的货币的损失,猜猜谁的工作有问题?使用原始方法还可以使口音、特殊字符和那些“有趣”的语言变得有趣-使用参数化查询有助于解决这一问题。@ChristopherDunne您收到大量关于安全性差的反馈(以及对注释的许多赞成票)的一个原因是,太多的开发人员没有认真对待安全性。无论你的网站是否上线,你的代码现在对全世界都是可见的。这就像一个厨师在烹饪节目上烧食物,然后说:“没关系,反正没人会吃。”
mysql2 = "SELECT password FROM [User] WHERE Password='" + tbPass.Text + "'";
OleDbCommand Pass = new OleDbCommand(mysql2, con);
string Password = Pass.ExecuteScalar().ToString();