2010-12-15 56 views
0

我試圖強調測試我係統的登錄單元。我的系統被設計這樣的 -SQL,Microsoft SQl

如果用戶輸入用戶標識 - ABCD和密碼傳遞則服務器需要這些參數,並準備一個SQL命令和它觸發到Microsoft數據庫 -

select password from UserInformationTable where userid = 'abcd'; 

返回值與給定的密碼傳遞進行比較,然後將結果發送給客戶端。

我成功地分解成使用以下方法的系統 -

用戶輸入用戶標識 - <abcd1 or drop table UserInformationTable>。這工作,我的完整UserInformationTable被刪除。

有沒有處理這種黑客問題的優雅方式。一種方法是檢測用戶標識中的'或'子串,但我沒有發現這非常優雅。有什麼辦法可以限制否。在SQL語句中的查詢?

感謝和問候, Radz

+1

你實際上是在使用參數還是隻是連接查詢字符串?此外,這是MySQL或SQL Server和你使用什麼語言? – 2010-12-15 01:01:42

+1

閱讀SQL注入。然後閱讀爲什麼存儲任何類型的明文密碼都不好。然後閱讀今天的CodingHorror.com關於如何利用第三方進行身份驗證是一條好路線。 – Joe 2010-12-15 01:04:25

+0

你必須使用SqlParameters [helplink](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx) – Raghuveer 2012-04-11 09:36:32

回答

0

在SQL查詢中使用參數。他們自動防止這一點。像這樣的東西在C#:

SqlCommand comm = new SqlCommand(conn); 
comm.CommandText = "SELECT * FROM foo WHERE bar = @id"; 
comm.CommandType = CommandType.Text; 

SqlParameter param = new SqlParameter("@id", DbType.Int64); 
param.Value = 3; // The actual value that replaces @id 

comm.Parameters.Add(param); 

// ... 

這不僅適用於C#,但基本上所有現代數據庫系統和語言支持參數化查詢< - 谷歌它。

第二,你的第一個查詢可以改爲:

SELECT userid FROM users WHERE username = 'foo' AND password = 'bar' 

然後就指望你有多少行返回,如果是0,那麼用戶輸入了錯誤的密碼。

0

你有兩個問題。

  1. 您受其他用戶描述的SQL注入攻擊。通過消毒您的輸入和/或使用參數化查詢來解決該問題。

  2. 您既不應存儲也不傳輸純文本密碼。爲什麼?在Slashdot上看到這個故事。解決此問題的方法是使用單向加密來創建密碼哈希以存儲在數據庫中。當用戶嘗試登錄時,使用與其提供的密碼相同的加密,然後搜索數據庫以查看是否存在具有相同用戶標識和密碼哈希的行。