如何将拼接SQL改写为参数化查询以防范SQL注入?(附现有代码)
修复SQL注入风险的参数化查询修改方案
你的代码通过字符串拼接生成SQL语句,存在严重的SQL注入风险,以下是两种可靠的参数化修改方案:
方案一:使用SqlParameter显式定义参数(推荐,便于控制参数类型)
直接通过SqlParameter对象定义每个参数,完全避免字符串拼接:
var filteredData = context.getProviderData .FromSqlRaw( "exec getProviderData @filter, @pageSize, @pageIndex, @allProviders, @Colname, @sort, @Terminatedproviders, @Prpr_entity='F'", new SqlParameter("@filter", filter), new SqlParameter("@pageSize", rows), new SqlParameter("@pageIndex", page), new SqlParameter("@allProviders", allProviders), new SqlParameter("@Colname", sidx), new SqlParameter("@sort", sord), new SqlParameter("@Terminatedproviders", TerminatedProviders) ) .ToList();
如果需要指定参数类型(比如字符串长度、数值类型),可以扩展SqlParameter的定义,例如:
new SqlParameter("@filter", SqlDbType.NVarChar, 500) { Value = filter ?? DBNull.Value }
方案二:使用EF Core插值语法(简洁易用)
利用FromSqlInterpolated方法,通过C#插值语法自动生成参数化查询,无需手动创建SqlParameter:
var filteredData = context.getProviderData .FromSqlInterpolated( $"exec getProviderData @filter={filter}, @pageSize={rows}, @pageIndex={page}, @allProviders={allProviders}, @Colname={sidx}, @sort={sord}, @Terminatedproviders={TerminatedProviders}, @Prpr_entity='F'" ) .ToList();
关键注意事项
- 所有来自用户输入或外部的变量必须通过参数传递,禁止直接拼接进SQL字符串
- 固定常量(如
@Prpr_entity='F')可以直接写在SQL中,无需参数化 - 避免使用
string.Format或直接+拼接SQL,这会重新引入注入风险
内容的提问来源于stack exchange,提问作者Jiiva Prasad
相关产品推荐
相关产品推荐

