【问题标题】:How to inject sql in sp_executesql如何在 sp_executesql 中注入 sql
【发布时间】:2015-11-25 09:43:12
【问题描述】:

我想知道是否可以通过 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 存储过程,其中名称是参数。

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 和字符串名称)

【问题讨论】:

  • 您可以尝试看看将O'Malley(带单引号)用作name 时会发生什么。或者包含-- 或可能对SQL 特殊的类似内容的名称。我认为/希望它会被正确转义。
  • 这个处理好了,char '被解码为double '' sql中这个char是什么意思

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


【解决方案1】:

是的,实体框架保护 SQLi 的方式与参数化查询大致相同。

事实上,正如您所见,EF 会为您生成一个参数化查询,并在 SQL 级别传递值。

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

【讨论】:

  • UNION SELECT 攻击怎么样?
  • 如果您无法从变量上下文中逃脱,那么任何攻击都会被阻止。
猜你喜欢
  • 2019-09-07
  • 2016-02-24
  • 1970-01-01
  • 2015-10-12
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2018-07-19
相关资源
最近更新 更多