-6
    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();

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

“用户代码未处理 OleDbException。”

谢谢。

4

3 回答 3

7

编辑

现在我仔细观察,这段代码有很多问题。标准做法是一次性检查用户名/密码组合:

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());

并使用用户名和密码值向命令添加参数。这样黑客就无法在不知道密码的情况下确定有效的用户名。


这个块:

    mysql2 = "SELECT * FROM [User] WHERE Password='" + tbPass.Text + "'";
    OleDbCommand Pass = new OleDbCommand(mysql2, con);
    string Password = Pass.ExecuteScalar().ToString();

将返回结果集第一行的第一列。除非是表中的第一列,否则您不会取回密码,而是获得其他值。PasswordUser

它可能是:

    mysql2 = "SELECT password FROM [User] WHERE Password='" + tbPass.Text + "'";
    OleDbCommand Pass = new OleDbCommand(mysql2, con);
    string Password = Pass.ExecuteScalar().ToString();
于 2013-05-10T13:53:52.990 回答
0

首先,仅仅因为它构建并不意味着它是正确的。

其次,您的代码容易受到 SQL 注入的影响。

第三,如果没有错误信息或意图,我们就无法判断出了什么问题。

最后但并非最不重要的一点是:您的代码仅在通过查询获得的第一列的第一行返回值 1 时才有效。我不知道您在做什么,但如果所有其他方法都适合您,您可能想要检查一下。

于 2013-05-10T13:53:38.530 回答
0

您可以简单地这样做:

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.
}
于 2013-05-10T13:53:49.367 回答