You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将拼接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:05:24