2010-04-11 34 views
0

我有一個Web應用程序,頁面上是更新頁面來更新一些配置文件信息。以下是我用來更新表格的代碼。但我認爲這是錯誤的。有什麼突出的東西嗎?連接字符串的工作原因是它用於讀取數據庫以獲取配置文件信息,因爲它包含數據庫的密碼/登錄信息,所以我只是將其刪除。Web窗體不更新表,爲什麼?

球員是類屬性,它包含玩家信息和DS是數據集,但我想更新數據庫本身在線...

Dim connectionString As String = "" 

Dim GigsterDBConnection As New System.Data.SqlClient.SqlConnection(connectionString) 
GigsterDBConnection.Open() 
Dim updatetoursql As String = "UPDATE PLAYERS SET FIRSTNAME = '" & player.FIRSTNAME & "', LASTNAME = '" & player.LASTNAME & "', ADDRESS = '" & player.ADDRESS & "', CITY = '" & player.CITY & "', ZIP = '" & player.ZIP & "', PHONE = '" & player.PHONE & "', EMAIL = '" & player.EMAIL & "', REFFEREDBY = '" & player.REFEREDBY & "' " 

updatetoursql = updatetoursql & "PLAYERID = '" & player.PLAYERID & "';" 

Dim cmd As New System.Data.SqlClient.SqlCommand(updatetoursql, GigsterDBConnection) 
Dim sqlAdapter As New System.Data.SqlClient.SqlDataAdapter(cmd) 
sqlAdapter.Update(ds, "PLAYERS") 

我認爲這個問題是什麼最後3行的代碼。我是對的還是他們更好的方式?

感謝

回答

2

那麼,除了等着咬你刺目的SQL注入問題.....(提示:使用參數化的查詢,而不是串聯起來你的SQL語句!)

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection) 
Dim sqlAdapter As New SqlDataAdapter(cmd) 

這裏的問題是:如果您以這種方式調用SqlDataAdapter構造函數,那麼您傳遞的是select(數據適配器的)命令 - 而不是更新命令!

你需要做的是這樣:

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection) 
Dim sqlAdapter As New SqlDataAdapter() 
sqlAdapter.UpdateCommand = cmd; 

現在你已經與SqlDataAdapter.UpdateCommand相關的UPDATE聲明,現在它應該工作。

關於SQL注入:我想強烈建議使用參數化查詢所有的時間 - 至少在生產代碼。因此,而不是串聯起來你的查詢,使用此:

Dim updatetoursql As String = 
    "UPDATE PLAYERS SET FIRSTNAME = @FirstName, LASTNAME = @LastName, " & 
    "ADDRESS = @Address, CITY = @City, ZIP = @Zip, PHONE = @Phone " & 
    "EMAIL = @EMail, REFFEREDBY = @ReferredBy, PLAYERID = @PlayerID" 

,然後執行命令或SqlDataAdapter.Update語句之前,設置這些參數,你的價值觀。這樣更安全,並且可以減少頭痛,甚至可以提高速度(如果僅在SQL Server內存中只緩存一次Update查詢)。

此外,爲什麼要一個SqlDataAdapter的漫長而複雜的方式?

在創建了SqlCommand並設置了所有參數後,只需撥打cmd.ExecuteNonQuery();即可完成!

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection) 

// set up the parameters here..... 
cmd.Parameters.AddWithvalue("@FirstName", FirstName); 
... etc. 

// just call ExecuteNonQuery - and you're done! 
cmd.ExecuteNonQuery(); 
+1

+1用於指出此代碼已廣泛用於SQL注入。如果一個字段中有一個單引號就會失敗,例如奧馬利姓氏的球員。 – 2010-04-11 13:48:53

+1

或想象一下,如果他叫'羅伯特'); DROP TABLE PLAYERS; - ':-) http://xkcd.com/327/ – 2010-04-11 13:57:03

+0

我知道sql注入。我只是想讓腳本起作用。它仍然沒有提交更改。 – JPJedi 2010-04-11 14:27:52

1

,在我跳起來最重要的事情就是如何開放SQL Injection攻擊這個代碼。

您不應該以這種方式構建SQL字符串,而是使用parameterized queries

除此之外,您正在構造您的適配器不正確,因爲構造函數將採取選擇命令,而不是更新命令。使用無參數構造函數創建命令,然後將您創建的命令分配給UpdateCommand屬性。