2013-05-10 197 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