2009-10-14 66 views
1

獲取數據移入和移出SQL表與C#獲取數據移入和移出SQL表與C#

我建立了一個將數據放入一個SQL表中的C#應用​​程序。

我目前在.net中使用SqlConnection類。 本文開始。 http://www.codeproject.com/KB/database/sql_in_csharp.aspx

我曾考慮過將Linq轉換成SQL,但之前沒有做過,也不知道如何起牀和去。


今天嗯,我對面,我試圖在其添加的數據,其中包括一個「'」,這打破了我的INSERT語句中的錯誤跑。我需要做一些研究,並開始想知道潛伏的其他問題。如果我嘗試添加數據「drop table」會怎麼樣?

我的問題是,是否有更好的數據插入模型?我看Linq嗎?還是在輸入之前檢查我的所有數據?

回答

8

您發現了SQL Injection Attacks。根據您指定的原因,僅將用戶提供的數據追加到SQL查詢中並不是一種好策略。系統中的任何用戶都可以嘗試通過注入一些SQL來竊取或破壞您的數據。

鏈接中描述了處理它的方式,但基本上可以指定參數並讓提供的類正確處理數據轉義,以便有人通過「Drop Table」時,它將作爲數據輸入。

下面是CodeBetter.com

SqlCommand command = connection.CreateCommand(); 
command.CommandText = "SELECT * FROM Customers WHERE CustomerID = @CustomerID"; 

command.Parameters.Add(
     new SqlParameter("@CustomerID", SqlDbType.NChar, 5)).Value = customerID; 

一個很好的例子,另外,隨意使用LINQ到SQL。它將爲您處理這個問題,並且從開發人員的角度來看更容易。您可以將數據庫拖放到代碼中,它將完全映射每個表。然後,您可以在您的代碼中正確編寫LINQ的SQL語句版本,您將在其中獲得代碼完成和編譯時間檢查錯誤。 This SO question will get you started

下面是一些簡單的LINQ代碼,可以讓你從數據庫中讀取一個客戶,寫他/她的名字在屏幕上,然後更新自己的個性化問候語(從SQL注入的所有安全):

Customer myCustomer = (
    from cust in myDatabase.Customers 
    where cust.CustomerID == userPassedCustomerID 
    select cust).Single(); 

Console.WriteLine(myCustomer.FullName); 

myCustomer.PersonalizedGreeting = userPassedGreeting; 
myDatabase.SubmitChanges(); 
4

最好處理需要與用戶輸入混合的數據庫查詢的方式是parameterized them。現在,LINQ to SQL會爲你做這件事,但簡單的舊ADO.NET也可以讓你做到這一點(正如我鏈接的文章所描述的那樣)。

無論您是調用存儲過程還是在您的應用程序中創建動態查詢以發送到RDBMS,這都可以工作。

1

看起來你正在做一些動態SQL,即在C#中使用各種字符串操作,然後運行這些動態即時創建SQL語句。

這種做法非常靈活,但引入了SQL injection的風險。這是一種偶然的情況,是自我造成的,但假設構建SQL語句時使用的某些元素是通過html字段提供的,惡意用戶可以製作特定的字符串以有效地「DROP TABLE」或更糟......

有很多方法可以解決這種情況,最常見的方法是使用參數化的SQL模板。通過這種技術,SQL語句的變量部分以不同的參數(稱爲SQL級參數)提供給SQL。 ADO Command對象是用於調用參數化查詢的工具。

LINQ to SQL也可以用來處理這種類型的事情。