2011-05-10 91 views
2

我有以下代碼片段。sql注入問題

SqlCommand cmd = new SqlCommand("SELECT FName,LName FROM EMPLOYEE_TABLE WHERE EmployeeID = '" +TextBox1.Text + "' AND Password = '"+ TextBox2.Text +"'", con); 
SqlDataReader x = cmd.ExecuteReader(); 

try 
{ 
    if (x.Read()) 
    { 
     name = (string)x["FName"] +' '+ (string)x["LName"]; 
     Session["NAME"] = name; 
     Session["ID"] = TextBox1.Text; 
     Response.Redirect("sample.aspx?action=On_Click"); 
    } 
    else 
    { 
     errormsg.Text = "login failed.Please enter Valid UserID and Password"; 
     errormsg.ForeColor = System.Drawing.Color.Red; 
    } 
} 
catch (Exception exp) 
{ 
    errormsg.Text = "Sorry,You dont have access to this portal."; 
} 
finally 
{ 
    x.Close(); 
    con.Close(); 
} 

現在,當我使用一個有效的ID(即存在)和密碼作爲ABC「或‘X’=」×然後將其登錄到數據庫中的第一個帳戶表中的。直到這很好。

但是,當我嘗試調試代碼時,它會引發錯誤Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

此外,如果它是拋出一個錯誤,那麼爲什麼它登錄到數據庫的第一個帳戶。注意:數據庫的第一個帳戶與我提供的用戶ID不同。

注:我是這個應用程序的開發。所以我沒有做任何違法的事情。 :)

+2

第一個問題是,如果你是開發商,你是知道SQL注入的,你爲什麼不至少使用參數化查詢? – Jaymz 2011-05-10 12:02:49

+0

雅,很好的問題。多數民衆贊成bcoz我剛纔瞭解到SQL注入,所以我嘗試在我自己的應用程序。然而我沒有太多的想法回合參數化查詢。 – scooby 2011-05-10 12:05:04

+0

.net有一些建立在一些blatent sql注入問題的保護(微軟正在做我認爲你應該要做的事)。我猜你正在遇到這些。我記得當我第一次發現SQL注入時,我也遇到了它們。 – Chad 2011-05-10 13:41:57

回答

3

看看你的SQL的這部分:

"' AND Password = '"+ TextBox2.Text +"'" 

有了您的密碼,這是

"' AND Password = ''x'='x'" 

這是不是你想要的SQL。

即使您嘗試執行SQL注入,也必須生成有效的SQL。通常,在關閉引號後用分號結束語句。看到這一點:

enter image description here http://xkcd.com/327/

0

您遇到的錯誤是調試錯誤,而不是實際的程序異常。這就是爲什麼當你正常運行時它會工作。

爲了彌補這個錯誤,我首先要確保所有東西都在Debug版本中運行。另外,確保你正在調試你想要檢查的變量的功能。嘗試跨越斷點幾次(F10)以刷新上下文。在互聯網上有一些其他的建議,如果你仍然有問題,你可能需要做一些搜索。

+0

我不關心這個錯誤。所有我想知道,如果在調試模式下應用程序進入catch語句,然後在哪裏,我把我的Response.Redirect(「sample.aspx?action = On_Click」); ,這樣它就不會直接進入該頁面,而是通過catch塊。 – scooby 2011-05-10 12:07:54

+0

這不是你發佈的問題,雖然... – Jaymz 2011-05-10 12:13:02

1

好的,根據您的主要問題提供答案(如您所述,您是SQL注入問題的新手)。

SQL注入是由動態構建SQL查詢使用用戶輸入作爲構造的一部分引起的。在.Net中最簡單的解決方案是創建一個參數化查詢。

我認爲傑夫·阿特伍德擁有最完整而簡明的文章提供的解釋和完整的例子here

從上面的鏈接引用:在手

SqlConnection conn = new SqlConnection(_connectionString); 
conn.Open(); 
string s = "SELECT email, passwd, login_id, full_name " + 
    "FROM members WHERE email = @email"; 
SqlCommand cmd = new SqlCommand(s); 
cmd.Parameters.Add("@email", email); 
SqlDataReader reader = cmd.ExecuteReader(); 

問題:

它的原因仍然登錄到帳戶是因爲該查詢仍然「有效」。

該聲明仍將被執行,相關記錄仍將從數據庫中返回,不會引發異常。

提供無效數據時,停止登錄過程的唯一方法是在執行查詢之前驗證輸入。您應該在之前始終驗證用戶輸入將其發送到數據庫。如果用戶要提供:

username'; drop table users;-- 

作爲用戶名,你將在一個很多麻煩

+0

謝謝,這確實有幫助。我明白這個錯誤。我想我需要改變我的代碼中很多東西。 因此,如果我寫這樣的查詢,那麼它是完全安全的SQL注入? – scooby 2011-05-10 12:18:07

+0

是的,如果從一開始就沒有設計這樣做,重寫應用程序以抵禦SQL注入確實是一項艱鉅的任務。 – Jaymz 2011-05-10 12:19:46