C# ASP.NET登录,密码无效

C# ASP.NET登录,密码无效,c#,asp.net,sql,C#,Asp.net,Sql,错误:FROM子句中的语法错误 “用户代码未处理OLEDBEException。” 谢谢。首先,它构建并不意味着它是正确的 其次,您的代码容易受到SQL注入的攻击 第三,如果没有错误信息或意图,我们就无法判断出哪里出了问题 最后但并非最不重要的一点:只有当通过查询获得的第一列的第一行返回值1时,代码才会工作。我不知道你在做什么,但如果其他一切都对你有效,你可能想检查一下。你可以简单地按以下方式操作: con.Open(); string mysql; // generate an

错误:FROM子句中的语法错误

“用户代码未处理OLEDBEException。”


谢谢。

首先,它构建并不意味着它是正确的

其次,您的代码容易受到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();