2015-11-04 72 views
-1

我在登錄時遇到問題,註冊用戶的名稱,電子郵件和密碼保存在數據庫中,並且電子郵件是用戶名。當我通過電子郵件和密碼登錄時,它顯示錯誤「位置0處沒有行」。 這裏是我的代碼:位置0處沒有行,例外

 con.Open(); 
     cmd = new SqlCommand("select * from userinfo where username='" + t1.Text.ToString() + "' and password='" + t2.Text.ToString() + "'", con); 
     da = new SqlDataAdapter(cmd); 
     da.Fill(ds, "abc"); 
     Session["name"] = ds.Tables["abc"].Rows[0][1].ToString(); 
     con.Close(); 

回答

0

因爲原因是Db的發現沒有一個記錄一樣路過的用戶名和密碼,就可以直接訪問所以它的給予例外。如果條件如下,請添加一個。

con.Open(); 
    cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @username AND password = @password", con); 
    cmd.Paramater.AddWithValue("@username", t1.Text.ToString()); 
    cmd.Paramater.AddWithValue("@password", t2.Text.ToString()); 
    da = new SqlDataAdapter(cmd); 
    da.Fill(ds, "abc"); 
    if(ds.Tables["abc"].Rows.Count>0) 
    { 
     Session["name"] = ds.Tables["abc"].Rows[0][1].ToString(); 
    } 
    con.Close(); 
+1

您的查詢已針對'SQL Injection attack'打開! –

+0

@downvoter,爲什麼選擇投票?在問題中沒有關於SQL注入的任何解釋。 –

+0

@ lazzy,是的,你是對的,但他在評論中給出了建議,不要做錯誤的回答。 –

0
cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @username AND password = @password", con); 
cmd.Paramater.AddWithValue("@username", t1.Text.ToString()); 
cmd.Paramater.AddWithValue("@password", t2.Text.ToString()); 
con.open(); 
SqlDataReader dr = cmd.ExecuteReader(); 
dr.read(); 
if(dr.hasRows){ 
Session["name"] = dr["username"].ToString(); 
} 
con.close(); 

儘量不要扔變量爲SQL命令。 SQL注入和所有。嘗試並通過參數

+0

我也嘗試過傳遞參數,但同樣的異常正在產生,@JiraiyaUK –

+0

你把IF語句放在了嗎?它看起來像你的編程崩潰,因爲沒有行可以返回。 – JiraiyaUK

+0

是的,我每次都給if語句,else部分正在執行。 –

0

該例外是因爲該表中沒有記錄。

沒有行,所以沒有Rows[0]

嘗試這樣:

using (var con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 
    cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @1 AND password = @2", con); 
    cmd.Paramater.AddWithValue("@1", t1.Text); 
    cmd.Paramater.AddWithValue("@2", t2.Text); 

    da = new SqlDataAdapter(cmd); 
    da.Fill(ds, "abc"); 

    if(ds.Tables["abc"].Rows.Any()) 
     Session["name"] = ds.Tables["abc"].Rows[0][1].ToString(); 

    con.Close(); 
} 

構建SQL查詢時,避免注入攻擊,您應該使用的參數。

不要忘記,SqlConnectionIDisposable,所以應該在using聲明(你可能已經這樣做了,但我已經包括它在這裏以防萬一)。

它也看起來像用戶的密碼正在從TextBox(或類似的控制)的輸入進行比較?如果是這樣,用戶的密碼不應以純文本形式存儲在數據庫中,因爲這是一個安全問題。考慮哈希存儲的密碼,對用戶的輸入做相同的處理,然後進行比較。 這不是問題的一部分,我知道,但值得指出,以防萬一。

+0

你可以解釋我如何哈希密碼在數據庫以及用戶的輸入。 –

+0

OWASP有一些可能有用的指導https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet,或者如果這不能給你提供所需的信息,你可以提出另一個問題。 –