2012-03-12 90 views
0

我正在設計一個ATM系統在C#和登錄功能我正在使用SQL服務器數據庫來比較輸入卡號和PIN到數據庫。當輸入正確的卡號和PIN碼時,一切正常,但當輸入的數值不正確時,我一直試圖弄清楚一段時間。有沒有人有任何想法,可能是什麼?即使我的大學講師也不知道!'其他'的if/else不執行時,它應該C#

//Select all fields from the table 'ATMCards' using the connection previously created and use the SqlDataReader to read the values 

爲了簡化它,我剛纔把messagebox.show在其他所有我想要做的是,至少有它觸發!

SqlCommand cmd = new SqlCommand("SELECT * FROM [ATMCards] WHERE (cardNumber = @cardNumber) AND (PIN = @PIN)", cn); 
cmd.Parameters.AddWithValue("@cardNumber", cboxSimCard.Text); 
cmd.Parameters.AddWithValue("@PIN", txtboxPIN.Text); 

cmd.Connection = cn; 
SqlDataReader r = null; 
r = cmd.ExecuteReader(); 

//While the reader is in execution: 
while (r.Read()) 
{ 
    //ADD IF NOT CONFISCATED DO THIS: 
    if (((Boolean)(r["confiscated"]) == notConfiscated)) 
    { 
     string cNum = r["cardNumber"].ToString(); 
     string pin = r["PIN"].ToString(); 

     //Compare the results in the ATMCards table against those on the form used to log in 
     if (string.Equals(cNum,cboxSimCard.Text) && string.Equals(pin,txtboxPIN.Text)) 
     { 
      MessageBox.Show("Card number "+cNum+" PIN "+pin); 
      //If the login details are correct then grant access to the menu screen by creating a new instance of it and hide the login form. Clear PIN to avoid the next user accessing the account 
      MessageBox.Show("Open form all is good"); 
      txtboxPIN.Clear(); 
      Form myNewForm = new Menu(); 
      myNewForm.Show(); 
      this.Hide(); 
      break; 
     } 

     else 
     { 
      MessageBox.Show("Here"); 
     } 
+0

你確定'r [「沒收」]!= notConfiscated'? – 2012-03-12 09:29:13

+4

你應該(學會)在這裏使用調試器。 – 2012-03-12 09:30:01

+0

我希望這臺ATM機是一個學習作業,而不是商業產品。例如,純文本密碼? – RvdK 2012-03-12 09:43:41

回答

8

當輸入了不正確的卡號和密碼,對,沒有行被從數據庫返回,因此立即while(r.Read())返回false。

+0

你在我打字的時候回答了:-) – Jodrell 2012-03-12 09:31:41

+0

@Jodrell,然後有投票:) – 2012-03-12 09:32:40

+0

@ Moo-Juice我看到了,我應該在哪裏放置錯誤的卡號和針腳對的代碼? while(r.Read())循環之外? – 2012-03-12 09:46:51

2

當您的where條件沒有匹配時,返回的結果集不包含行。第一個r.Read返回false,並且while循環的內容從不執行。

由於Henk Holterman評論,如果你調試代碼,這將是顯而易見的。

繼簡單的答案...

你不應該執行你這樣的SQL。它讓你打開注射攻擊。您可以使用Linq-To-Entities或在打電話給sp_ExecuteSQL的過程中包裝SQL。

PIN不應該作爲純文本存儲,而應作爲PIN和其他卡片詳細信息的安全散列存儲。

卡號不應以純文本形式存儲。如果你永遠不需要讀取卡號可以被哈希。否則加密

我假設你是驗證卡的細節,使用模13或一些行業標準檢查之前,將查詢傳遞到數據庫。

我並不是建議你可以重新創建ATM內實際發生的事情,但是對敏感數據所需的安全性的某些點頭肯定會產生額外的功勞。 (雙關語不打算)

+0

我看到了,我應該在哪裏放置錯誤的卡號和針腳對的代碼? while(r.Read())循環之外? – 2012-03-12 09:47:17

+0

嗯,我認爲你只想要一行權利,少或多都是例外。我會先處理讀取,以便在處理數據之前檢查異常。 – Jodrell 2012-03-12 09:53:51

+0

@湯姆克魯克,可以把沒收的支票放在你的where子句中,除非你想記錄使用沒收的卡。 – Jodrell 2012-03-12 09:58:35

0

人你的代碼是

  1. 並不安全,可能注入
  2. 信用卡和引腳必須被加密和u didnt
  3. 您的代碼將永遠不會顯示在故障情況下的任何消息因爲如果沒有數據reutrned的如果在裏面條款將不執行

可以使用

if(reader.HasRows) 
///then do happy case 
else 
//show error message 
+0

我認爲我們不應該期望在世界級的安全級別實施基本的大學任務...... – 2012-03-12 09:33:40

0

對我來說,似乎這樣的:

if (string.Equals(cNum,cboxSimCard.Text) && string.Equals(pin,txtboxPIN.Text)) 

是否somethign錯誤的。嘗試使用與String.Equals(String, StringComparison)相同功能的重載。像這樣

if (cNum.Equals(cboxSimCard.Text, StringComparison.InvariantCultureIgnoreCase) && pin.Equals(txtboxPIN.Text, StringComparison.InvariantCultureIgnoreCase)) 
相關問題