2012-04-20 96 views
0

我們正在嘗試調試一些遺留代碼。我們發現,我們可以通過爲所有用戶使用密碼「密碼」登錄系統。我們還可以使用用戶名「username」和密碼「password」進行登錄,並且可以使用用戶名「username」和系統中某個用戶的密碼進行登錄。此SQL代碼是否應讓我們使用「用戶名」和「密碼」登錄?

這使我們認爲它可能是SQL查詢的問題,它可能與登錄表單中的用戶名字段與列「用戶名」或字符串「用戶名」匹配。 (與密碼相同)。

但是,我們不幸的是VB.net人並且無論我們做什麼,這種行爲似乎都是一樣的。這裏是原代碼:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = """ & username & """ AND password = """ & password & """" 
SQLreader = SQLcommand.ExecuteReader() 

(我們不知道所有的""" s爲約)

因此,使用我們所知道的編程和SQL我們這樣做:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE `username` = """ & username & """ AND `password` = """ & password & """" 
SQLreader = SQLcommand.ExecuteReader() 

其中沒有效果,類似地:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE tblUsers.username = """ & username & """ AND tblUsers.password = """ & password & """" 
SQLreader = SQLcommand.ExecuteReader() 

也沒有效果。

所以問題是這是SQL代碼的問題?還是我們看錯了地方?我不認爲我們看錯了地方。儘管我們不是VB.net人,但我們仍然非常精通編程。也輸出(跟蹤)SQLreader(0)返回1作爲用戶名和密碼,這將意味着它是匹配的東西與「用戶名」和「密碼」的查詢。

任何幫助將是偉大的。有什麼我們可以忽略的嗎?

感謝

(免責聲明:!這個代碼是不是在生產環境中的任何地方使用,您可以現在都放寬)

+2

「tblUsers」表中的數據是什麼樣的?在VB.NET中,通過加倍字符串(在SQL Server中這是正確的字符串分隔符),可以在字符串中轉義一個'''。「 – Oded 2012-04-20 16:13:50

+0

我會告訴你數據!:)給我一分鐘什麼是不對? – 2012-04-20 16:15:30

+0

在SQL Server中,你可以用單引號或雙引號分隔字符串,這就是我的意思。 – Oded 2012-04-20 16:16:13

回答

2

如果我正確地讀這篇文章,你有幾個問題在這裏。

假設您在這裏連接到Microsoft SQL Server(因爲您使用的是SQLCommand),所以您在用戶名和密碼變量周圍放置雙引號,從而表示您將列用戶名與列(無論在變量中)。假設用戶名有「john」,密碼中有「1234」。 SQL語句如下:

SELECT level FROM tblUsers WHERE username = "john" and password = "1234" 

雙引號的意思是,無論文本是有一列的名稱,所以SQL是尋找所謂的約翰·列和1234,您應該使用單引號/撇號。

SELECT level FROM tblUsers WHERE username = 'john' and password = '1234' 

如果您使用的用戶名「用戶名」和密碼「密碼」,你實際上只是從用戶表中選擇水平,username列= username列,密碼列=的密碼欄。 (:

無論如何,除了所有這些,將變量直接粘貼到SQL查詢中,您的查詢將保留爲SQL注入,因此最好使用參數。

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = @username AND password = @password" 
SQLcommand.Parameters.AddWithValue("@username",username) 
SQLcommand.Parameters.AddWithValue("@password",password) 
SQLreader = SQLcommand.ExecuteReader() 

把那一個鏡頭。

+1

您忘記了參數添加中的@符號。 – Matt 2012-04-20 16:53:14

+0

我在MSDN上看到過一個不使用它的例子。這對我來說有點奇怪。特別是在這種情況下,字段名稱與參數名稱相同。 「@」在命令中區分了這一點。有趣的是,我猜想。 – Matt 2012-04-20 16:58:36

+0

我決定繼續並添加它。我認爲這對於那些可能只是學習參數的人來說更加清楚。謝謝(: – darin 2012-04-20 17:02:11

相關問題