2011-04-24 45 views
1

我正試圖從Web窗體連接到SQL Server,但在代碼中獲取不正確的語法異常。連接代碼中的異常

保護無效的button1_Click(對象發件人,EventArgs的) {

SqlConnection的CN =新的SqlConnection(ConfigurationManager.ConnectionStrings [ 「HRMSConnectionString1」]的ToString());

{ 
     SqlCommand cmd = new SqlCommand("select * from persons where User_Id="+uid.Text+"and Password!="+pswd.Text, cn); 

     cn.Open(); 

     SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //exception in this line 

     rdr.Read(); 

     Response.Write(rdr[0].ToString()); 
    } 

}

請指引我這裏m走錯了。

+0

有些事情,你需要知道的是[SQL注入](HTTP。: //en.wikipedia.org/wi ki/SQL_Injection)你的代碼容易受到這種類型的攻擊,因此根本就不安全。一旦你的代碼工作,嘗試輸入這個密碼:''OR 1 = 1 - '。在評論中討論太複雜,但查看[SQLCommand](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx)對象並進行一些閱讀。在你完成之前,你絕對不應該在任何實際的系統中使用這個代碼。 – Basic 2011-04-25 12:21:27

+0

此外,您將密碼存儲在「純文本」中,這意味着您和任何進入數據庫的人都可以讀取每個用戶的完整密碼 - 不安全。有關更多信息,請參閱[本文](http://www.4guysfromrolla.com/articles/103002-1.aspx)以獲取該主題的介紹 – Basic 2011-04-25 12:24:27

回答

0

數據庫要看到周圍的字符串引號:

"select * from persons where User_Id='"+uid.Text+"'and Password!='"+pswd.Text+"'" 
0

嘗試:

"Select * from persons where [User_Id] ='"+uid.Text+"'and [Password] <> '"+pswd.Text + "'" 

另外:Protect your parameters!這是防止SQL注入的必要條件。

0

看起來你正在使用這個!=運營商的不等於目的,但是這是在預設電臺的語言。對於Sql,您需要使用<>運算符

看起來您也正在使用帶有+的sql查詢,這在任何情況下都必須避免。

因此,最終的代碼(粗糙)應該是這樣

SqlCommand cmd = new SqlCommand("select * from persons where User_Id='@userid' 
    and Password<>'@password'",cn);   
    cmd.Parameters.Add(@userid,uid.Text); 
    cmd.Parameters.Add(@password,pswd.Text); 
    cn.Open();   
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    rdr.Read();   
    Response.Write(rdr[0].ToString()); 

(還有我不知道這是什麼查詢的目的,但你只使用一個值取*,然後,如果你只是想檢查一個值,你可以使用查詢像

Select count(1) from persons where User_Id='@userid' and Password<>'@password' 

,然後用ExecuteScalar方法只是一個建議使用它