代码之家  ›  专栏  ›  技术社区  ›  Thomas Stock

当sp包含动态SQL时,在基于linq的存储过程调用中转义撇号

  •  1
  • Thomas Stock  · 技术社区  · 17 年前

    我注意到以下几点:

    正在开发的ASP.NET MVC网站在对包含动态SQL的存储过程进行LINQ调用时,会收到一个SQL错误“未闭合引号…”。

    例如:

    sp getemployees使用值为[N'for]的参数[filter\u name]调用时引发此错误

    我可以通过这样的.replace(“”,“”)来解决问题:

    [Function(Name = "dbo.GetEmployees")]
    public ISingleResult<EmployeeRow> GetEmployees(
                [Parameter(DbType = "NVarChar(MAX)")] string filter_name)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), filter_name.Replace("'", "''"));
        return ((ISingleResult<EmployeeRow>)(result.ReturnValue));
    }
    

    现在,我不想通过我所有的运动计划来手动操作。 有没有一种方法可以使这成为一个通用规则,应该应用于我现在和将来进行的所有LINQ SP调用?

    另外,还有什么我应该转义的东西来防止SQL注入攻击吗?

    编辑:

    添加的问题:这会给不包括动态SQL的SP带来问题吗? 我的意思是,当我在数据库中添加这个名字时,它会被存储为[N''for]? 我刚意识到情况可能会是这样,然后无论如何我都得手动操作。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Bravax    17 年前

    我建议您远离动态SQL,因为这是问题的根源。 (我知道这可能会导致许多其他问题,而且可能不可能。)

    除非您能够保证您正在构建的动态SQL是安全的(所以您在内部控制这个逻辑,而用户没有传递任何信息),否则这将是一个问题。

    如果筛选器名称包含\或--,会发生什么情况?

        2
  •  0
  •   Thomas Stock    17 年前

    我将在这里回答我自己的问题。(如果您同意,请在评论中告诉我)

    应该在SP内部处理这一点似乎更为正确。 应用程序不必担心某个SP是否包含动态SQL。

    推荐文章