在ASP.NET中使用参数化查询的正确姿势是什么?

P粉602998670

P粉602998670

2026-07-16

460人浏览

原创

参数化查询的关键在于参数值构造方式和通配符位置:like语句须将%写入参数值而非sql字符串,fromsql仅支持{0}占位符绑定,request.params等入口需显式指定来源,复杂查询优先用linq而非手写sql。

在asp.net中使用参数化查询的正确姿势是什么?

直接说结论:参数化查询不是“用了就行”,关键在参数值的构造方式和 SQL 字符串中通配符的位置——LIKE 语句最容易翻车,FromSql 容易误用,Request.Params 这类入口最常被忽略。

LIKE 查询必须把 % 写进参数值里,不能写在 SQL 字符串里

很多人写 "SELECT * FROM User WHERE Name LIKE '%@keyword%'",看着像参数化,实际完全无效。SQL Server 会把 @keyword 当作字面量字符串,而不是变量,导致永远查不到结果。

  • ✅ 正确做法:cmd.Parameters.AddWithValue("@keyword", "%" + userInput + "%"),SQL 字符串写成 "SELECT * FROM User WHERE Name LIKE @keyword"
  • ❌ 错误写法:"SELECT * FROM User WHERE Name LIKE '%' + @keyword + '%'""... LIKE '%@keyword%'" —— 这两种都等于没参数化
  • ⚠️ 注意点:如果用户输入本身含 %_,且业务需要原义匹配,得配合 ESCAPE,比如 LIKE @pattern ESCAPE '',然后传入 "%abc%%" 并设 cmd.Parameters["@pattern"].Value = "\%abc\%\%"

EF Core 的 FromSql 必须用 {0} 占位符 + 参数列表,不能拼接字符串

FromSql 看似支持字符串格式化,但 "SELECT * FROM Dept WHERE Id = " + id$"SELECT ... WHERE Id = {id}" 都是高危操作。EF Core 的 FromSql 只对 {0}{1} 这种位置占位符做安全绑定,其余一律当原始 SQL 处理。

ASP.NET参考手册
ASP.NET参考手册

ASP.NET参考手册下载

下载
  • ✅ 安全调用:_context.Departments.FromSql("SELECT * FROM Department WHERE Id = {0}", id)
  • ❌ 危险写法:_context.Departments.FromSql($"SELECT * FROM Department WHERE Id = {id}") —— 编译期不报错,运行时直接注入
  • ⚠️ 补充说明:EF Core 5+ 支持命名参数(如 {@id}),但底层仍依赖 DbCommand 的参数绑定机制,别指望它能自动识别变量名;命名只是可读性优化,不是安全兜底

所有 Request 入口都要统一校验,别只盯 QueryString

开发者常以为 Request.Query["q"] 是唯一风险入口,其实 Request.Params["q"] 更危险——它会按 Query → Form → Cookies → ServerVariables 顺序查找,一旦某处被污染(比如恶意 Cookie),就绕过所有前端过滤。

  • ✅ 推荐做法:显式指定来源,例如只取 HttpContext.Request.Query["search"]HttpContext.Request.Form["search"],禁用 Request["key"]Request.Params["key"]
  • ❌ 常见疏漏:后台导出接口用 Request["filter"] 拼接 SQL,以为“内部系统没人用”,结果被员工浏览器插件或调试工具轻易触发
  • ⚠️ 特别注意:MVC 路由参数(如 /user/{id})默认走模型绑定,但如果手动用 RouteData.Values["id"] 拼 SQL,一样不安全

复杂查询别硬刚 SQL,优先用 LINQ + AsNoTracking

当业务需要动态 WHERE 条件(比如多字段模糊搜索、可选排序),硬写参数化 SQL 很容易漏掉某个分支。EF Core 的 LINQ 查询天然参数化,且编译期就能检查类型安全。

  • ✅ 推荐路径:_context.Users.AsNoTracking().Where(x => x.Name.Contains(keyword)).OrderBy(x => x.CreatedAt),EF 自动生成带参数的 SQL
  • ❌ 折中陷阱:先拼 LINQ 表达式树再转 SQL 字符串——这一步如果用了 Expression.Constant 插入用户输入,等于又回到字符串拼接
  • ⚠️ 性能提示:AsNoTracking() 在只读场景下能显著降低内存开销,但别为了省这点性能去换手写 SQL + 参数化

真正难的不是写出第一个参数化查询,而是让每个 Request 取值、每条 LIKE、每个 FromSql 调用、甚至每个历史遗留的 Response.Write 输出,都保持同一套参数构造逻辑。安全不是加个 @param 就完事,是让参数值从进入应用那一刻起,就再没机会被当成 SQL 代码执行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

2474

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

449

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

615

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3990

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

1347

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

3562

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

3536

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

642

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

526

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ASP.NET参考手册
ASP.NET参考手册

共0课时 | 0.6万人学习

传播智客ASP.NET中级系列视频教程
传播智客ASP.NET中级系列视频教程

共33课时 | 7.2万人学习