如何分离SQL查询参数存入数组以防范SQL注入,有无相关工具包?
SQL注入防护参数化实现方案
你需要的SQL逻辑与参数分离、占位符替换、参数统一归集处理的能力,是业界通用的标准防护方案,不需要自己手写SQL拆分逻辑,几乎所有主流后端技术栈的官方数据库驱动都原生支持,也就是常说的**预编译语句(Prepared Statement)**机制,从底层杜绝SQL注入风险。
核心实现规则
- SQL语句中只保留查询、更新的逻辑结构,所有动态传入的参数值全部替换为占位符,通用占位符为
?,部分框架支持@参数名形式的具名占位符 - 所有替换下来的参数值按占位符顺序存入数组/参数集合,交给数据库驱动底层做安全转义处理,不会出现参数内容被拼接成SQL逻辑执行的问题
不要自行编写正则或字符串处理逻辑拆分SQL参数,边界场景极多容易出漏子,比如你给出的更新语句里
note_description字段值包含的@8:57am就很容易被误识别为参数标记,字符串内的转义单引号、特殊字符处理稍有不慎就会留下注入漏洞,直接用官方实现的预编译能力是最稳妥的选择。
原有SQL的参数化改写示例
以通用?占位符规范为例:
- 月份范围查询语句
SELECT * FROM table1 WHERE year_month BETWEEN ? AND ?;
对应参数数组:['2021-08', '2022-01']
- 备注更新语句
UPDATE table2 SET note_description = ?, patient_id = ?, note_updated_by = ?, note_update_date = ? WHERE note_id = ?;
对应参数数组:['test @8:57am', '5840', '10000019', '2022-07-13 09:45:49', '639']
各技术栈原生支持说明
不需要额外引入特殊安全依赖,直接用对应栈的标准数据库操作能力即可:
- Java生态:JDBC原生
PreparedStatement、MyBatis、Spring JPA等框架的参数绑定默认走预编译逻辑 - Python生态:pymysql、psycopg2等符合DB-API规范的驱动,调用
execute(sql, params)时传入参数列表即可 - Node.js生态:mysql2、pg等主流驱动的
execute方法原生支持参数数组传入 - Go生态:标准库
database/sql的Query/Exec方法传入参数时默认启用预编译 - .NET生态:给SqlCommand的Parameters集合添加对应参数即可实现安全绑定
内容的提问来源于stack exchange,提问作者kichu
相关产品推荐
相关产品推荐

