我注意到以下内容:
正在开发的ASP.NET MVC网站在对包含动态SQL的存储过程进行LINQ调用时会收到SQL错误“Unclosed quotation mark ...”。
例如:
使用参数[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]? 我刚刚意识到这可能就是这种情况,然后我必须手动完成
答案 0 :(得分:1)
我建议你放弃动态SQL,因为这是问题的根源。 (我知道这可能会导致许多其他问题,但可能无法实现。)
除非你能保证你正在构建的动态SQL是安全的(所以你在内部控制这个逻辑,没有任何东西从用户传递),这将是一个问题。
如果filter_name包含\'或 - ?
,会发生什么答案 1 :(得分:0)
我将在这里给出一个(可能的)答案。 (如果你同意,请在评论中告诉我)
这应该在SP内处理似乎更为正确。 应用程序不应该担心某个SP是否包含动态sql。