2013-05-10 194 views
-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子句中的语法错误。ASP.NET登录,无效密码

“OleDbException未被用户代码处理”。

谢谢。

+2

请使用SQL参数 – DGibbs 2013-05-10 13:51:27

+1

@Benjamin号只是没有。 – Renan 2013-05-10 13:51:45

+2

1)参数化您的查询。 2)哈希你的密码。阅读关于SQL注入 – MikeTheLiar 2013-05-10 13:51:47

回答

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

如果某些用户使用它会变得有趣相同的密码:-) – nWorx 2013-05-10 13:55:15

+1

@ChristopherDunne,我觉得它更因为它可以节省你心痛的道路。如果你使用这种代码在一家大公司编码,并且黑客使用*那个*代码打入一个造成数千美元/磅/你最喜欢的货币的系统,造成损害,那么猜猜谁的工作是在线?使用原始方法也可以使口音,特殊字符和那些“有趣”的语言变得有趣 - 使用参数化查询有助于避免这种情况。 – Arran 2013-05-10 14:18:05

+1

@ChristopherDunne你得到很多关于安全性差的反馈的很多原因之一(以及许多对评论的看法)是因为**太多的开发人员不重视安全性**。无论您的网站是否上线,您的代码现在都可以在全世界看到。这就像厨师在烹饪节目上燃烧食物,然后说 - “没关系,反正没有人会吃它。” – 2013-05-10 14:31:49

0

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

其次,您的代码易受SQL注入攻击。

第三,没有错误信息或意图,我们没有办法让我们明白出了什么问题。

最后但并非最不重要的:如果与查询获得的第一列的第一行返回值1。我不知道你在做什么,但如果一切都为你的作品你的代码只会工作,你可能想检查一下。

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. 
} 
+0

那JIT调试是什么... – 2013-05-10 14:02:31