如何在sp_executesql中注入sql

时间:2015-08-31 11:08:00

标签: .net entity-framework security model-view-controller sql-injection

我想知道是否可以通过sql-injection攻击这个简单的代码。

        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 存储过程,其中name是参数。

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)如果不是,用户应该输入 name var来列出表Models中的所有条目(两列:int id和string name)

1 个答案:

答案 0 :(得分:2)

是的,实体框架可以像参数化查询一样防范SQLi。

事实上,正如您所看到的,EF为您生成参数化查询,并在SQL级别传递值。

如上所述,一个简单的测试是尝试包含单引号的字符串,并查看生成的动态SQL。