我注意到以下内容:

正在开发的ASP.NET MVC网站收到SQL错误“Unclosed quotation mark ...”。当它对包含动态SQL的存储过程进行LINQ调用时。

例如:

使用参数[filter_name]调用SP GetEmployees,其值为[n'for]会抛出此错误

我可以通过执行.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));
}

现在,我不想通过我的所有SP并手动执行此操作。 有没有办法使这个应用于我现在和未来将要进行的所有Linq SP调用的一般规则?

此外,还有什么我应该逃避以防止SQL注入攻击吗?

编辑:

补充问题:这会给那些不包含动态sql的SP带来问题吗? 我的意思是,当我在数据库中添加该名称时,它是否会被存储为[n''for]? 我刚刚意识到这可能就是这种情况,然后我必须手动完成

有帮助吗?

解决方案 2

我将在这里给出一个(可能的)答案。 (如果你同意,请在评论中告诉我)

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

其他提示

我建议你放弃动态SQL,因为这是问题的根源。 (我知道这可能会导致很多其他问题,而且可能无法实现。)

除非你能保证你正在构建的动态SQL是安全的(所以你在内部控制这个逻辑,没有任何东西从用户传递),这将是一个问题。

如果filter_name包含\'或 - ?

,会发生什么
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top