2009-01-23 100 views
47

我正在建立一個公共站點,我首先想到的是SQL注入。我有一些我正在保存的文本字段,正在使用linq來更新/寫入數據庫。我安全使用LINQ?將使用LINQ to SQL幫助防止SQL注入

本示例創建用戶帳戶。

Data.MemberRegistrationDataContext context = new MemberRegistrationDataContext(); 
Data.tbl_Member_UserProfile profile = new tbl_Member_UserProfile(); 
profile.SSN = Convert.ToDecimal(Session["tempMemberSSN_Registration"]); 
profile.UserName = userName; 
profile.Password = password; 
profile.EmailAddress = email; 
profile.QuestionID = qID; 
profile.QuestionResponse = securityAnswer; 
profile.LastModDt = DateTime.Now; 
profile.LastModBy = "web"; 
context.tbl_Member_UserProfiles.InsertOnSubmit(profile); 
context.SubmitChanges(); 

這個例子是改變密碼

MemberRegistrationDataContext dc = new MemberRegistrationDataContext(); 
    var mProfileRecord = dc.tbl_Member_UserProfiles.Single(c => c.SSN == sSSN); 
    mProfileRecord.Password = sNewPassword; 
    dc.SubmitChanges(); 

這些是安全的? LINQ是否會自動生成它生成的SQL參數?

+2

讀者注意:實體框架也是如此。請參閱http://stackoverflow.com/questions/3473841/entity-framework-linqtosql-and-sql-injection – 2013-07-03 20:33:38

回答

68

是的,LINQ將幫助停止SQL注入。

LINQ to SQL通過SQL參數將所有數據傳遞到 數據庫。因此,儘管動態地將SQL查詢組合爲 ,但這些值被替代爲 服務器端通過參數 針對最常見的SQL注入攻擊的原因提供保護。

另外,請參閱Eliminate SQL Injection Attacks Painlessly with LINQ瞭解一些信息。

+0

應該指出,當他們說「通過所有數據」時,他們的意思是「所有數據」 - 甚至是硬編碼值:「db.Employees.Where(e => e.Active == 1)」將傳遞「1」作爲參數。 – 2009-01-23 15:17:13

14

你很好走。 Linq確實將它發送到數據庫的數據參數化。

使用日誌屬性來看看發生了什麼:dc.Log = Console.Out;

3

它應該是因爲SQL發射使用名爲不能被利用來執行任意SQL參數。