1

我想知道是否有可能通過sql-injection攻擊這個簡單的代碼。如何在sp_executesql中注入sql

 string name = Console.ReadLine(); 
     using (var db = new Db()) 
     { 
      var result = db.Models.Where(p => p.Name == name); 
      foreach (var item in result) 
       Console.WriteLine(item.Name); 
     } 

EntityFrameork執行該命令使用sp_executesql的存儲過程其中名稱是參數。

exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name] 
    FROM [dbo].[Models] AS [Extent1] 
    WHERE ([Extent1].[Name] = @p__linq__0) OR 
    (([Extent1].[Name] IS NULL) AND (@p__linq__0 IS NULL))' 
    ,N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'jacek' 

我的問題是:
1)這是否解決方案給防禦的100%再SQL注入?
2)如果沒有,應輸入哪些用戶進入 VAR列出的錶款中的所有條目(兩列:INT id和字符串名稱)

+1

你可以嘗試看看當你使用'O'Malley'(帶單引號)作爲'name'時會發生什麼。或者是一個包含'--'或類似的東西的名字,可能對SQL來說是特殊的。我認爲/希望它能夠正確逃脫。 –

+0

這是處理,字符'被解碼爲雙''這意味着這個字符在SQL – Jacek

回答

2

是,實體框架防止SQLI在大致相同的作爲參數化查詢的方式。

實際上,您可以看到,EF會爲您生成一個參數化查詢,並在SQL級別傳遞該值。

如上所述,一個簡單的測試是嘗試一個包含單引號的字符串,並查看生成的動態SQL。

+0

UNION SELECT攻擊呢? – Jacek

+0

如果你不能從變量上下文中逃脫,那麼任何攻擊都會被阻止。 – SilverlightFox