如何防止SQL注入利用存储过程_确保存储过程不拼字符串

必须用sp_executesql代替EXEC实现参数化查询,严格声明参数类型与长度,对表名列名等动态部分采用白名单校验,并对输入参数做强类型声明和范围检查。存储过程中用 sp_executesql 代替 EXEC 才安全直接拼接字符串再执行,哪怕在存储过程里,照样被注入。SQL Server 的 EXEC 会把整个字符串当命令解析,参数没隔离------@sql = 'SELECT * FROM users WHERE id = ' + @id 这种写法,传入 @id = '1; DROP TABLE users; --' 就完蛋。必须改用 sp_executesql,它支持真正的参数化查询,SQL 引擎会在编译阶段就区分代码和数据:DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM users WHERE status = @status AND created_after = @since';EXEC sp_executesql @sql, N'@status TINYINT, @since DATETIME', @status = 1, @since = '2024-01-01';sp_executesql 的第二个参数是参数定义字符串,必须显式声明类型和长度(比如 NVARCHAR(50),不能只写 NVARCHAR)第三个及之后的参数才是实际值,顺序和定义严格对应别图省事把变量名和参数名搞混:定义里写 @status,调用时也得传 @status = ...,不是传变量值本身如果动态部分涉及表名或列名(无法参数化),必须走白名单校验,不能靠 REPLACE 或正则过滤所有用户输入进存储过程前,先做类型强转和范围检查即使用了 sp_executesql,如果参数本身是弱类型或未校验,攻击者仍可能绕过。比如把 @id 设为 INT 类型,但调用时传入 '1 OR 1=1',SQL Server 会隐式转成 1------看似安全,实则掩盖了上游传参不规范的问题。存储过程参数声明必须用具体、窄的类型:@user_id INT,而不是 @user_id SQL_VARIANT 或宽泛的 NVARCHAR(MAX)对数字类参数,加 IF @user_id < 1 OR @user_id > 999999 RETURN 这类硬约束对字符串类参数(如用户名),用 LEN(@name) > 0 AND LEN(@name) <= 50 AND @name NOT LIKE '%\^a-zA-Z0-9_%' 控制内容范围避免在存储过程里做 CAST 或 CONVERT 转换用户输入------转换失败会报错,但成功转换后可能已失真禁止在存储过程中拼接对象名(表名、列名、排序字段)表名、列名、ORDER BY 字段这些语法成分,SQL Server 不允许用参数占位,硬拼就是高危操作。见过太多人写 SET @sql = 'SELECT * FROM ' + @table_name,再加一层 QUOTENAME(@table_name) 就以为万事大吉------但 QUOTENAME 只防单引号,防不了 ]; DROP TABLE x; -- 这种结尾注入。 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

相关推荐
zhangzeyuaaa12 分钟前
Python requests:raise_for_status() 与 4xx/5xx 异常层次详解
开发语言·python
泡海椒19 分钟前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python
余槐i27 分钟前
Firecrawl 实战:将网站转换为大模型可用数据
人工智能·python·工具·firecrawl
shirsl28 分钟前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
步行cgn29 分钟前
Spring 启动报错:BeanFactory not initialized 的原因与解决
java·python·spring
梦想平凡35 分钟前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
凤山老林44 分钟前
Spring Boot 整合 Flowable 的企业级落地指南
数据库·spring boot·后端·flowable·工作流
企业数字化笔记1 小时前
AI写的系统出现504怎么办?接口超时和数据库慢查询排查
数据库·后端
quantdash_cc1 小时前
股票历史数据为什么比实时行情更重要?回测结果失真的根源可能就在 K 线数据
开发语言·python·数据分析·量化交易·股票数据·quantdash
Web3&Basketball1 小时前
LLM 峰谷定价怎么吃满:一个能对账的错峰调度器
python·性能优化·大模型·任务调度·成本优化·deepseek·推理优化