如何在Node.js 20中修复SQL注入

夏浩姑娘_6195

夏浩姑娘_6195

2026-08-11

715人浏览

原创

Sequelize在Node.js 20下默认安全,模型方法(findAll/update/destroy)自动参数化;高危点仅三处:sequelize.query()字符串拼接、literal()/fn()塞用户输入、动态列名/表名未白名单校验。

如何在node.js 20中修复sql注入

直接用模型方法,别碰 raw SQL

Sequelize 在 Node.js 20 下默认就是安全的,只要你不用 sequelize.query()、literal() 或 fn() 塞用户输入。所有模型调用——比如 Model.findAll()、Model.update()、Model.destroy()——都自动走参数化绑定,不需要你额外加 escape 或手动校验类型。

常见错误是看到搜索功能要动态字段,就写成:order: [[literal(`${req.query.sortBy} ${req.query.order}`)]]。这等于把控制权交给了攻击者,id; DROP TABLE users-- 这类输入会直接执行。

  • 动态排序字段必须白名单校验:['id', 'name', 'created_at'].includes(req.query.sortBy)
  • attributes 里写 [[req.query.field, 'alias']] 是列名注入,同样要白名单
  • 函数包装字段改用 sequelize.col('username'),而不是 literal(req.query.q)

sequelize.query() 必须用 replacements 或 bind

sequelize.query() 是唯一能绕过模型层的高危入口,它不检查输入,只认你传参方式。用模板字符串插值(哪怕加了 AS)或拼接字符串,一律算裸奔。

正确写法只有两种:

  • 命名绑定:sequelize.query("SELECT * FROM users WHERE status = :status", { replacements: { status: req.body.status } })
  • 位置绑定:sequelize.query("SELECT * FROM users WHERE id = ?", { replacements: [req.params.id] })

⚠️ 注意::status 和 ? 不能混用;replacements 和 bind 不能同时传;传错类型(比如把字符串当数字塞进 ?)可能触发类型不匹配错误,但不会导致注入。

cn-json-diff
cn-json-diff

比较两个 JSON 文件并显示差异。支持嵌套结构、数组及值变更。纯 Python 标准库实现,无需 API 密钥。

下载

原生驱动如 mysql2、pg 必须严格用占位符

如果你没用 ORM,直接连数据库,mysql2.query() 和 pg.client.query() 的占位符机制就是防注入的全部防线。拼字符串=开门揖盗。

  • MySQL:占位符是 ?,参数必须是数组,哪怕只有一个值:query("SELECT * FROM users WHERE id = ?", [req.query.id])
  • PostgreSQL:只认 $1、$2 这种数字位置参数,顺序必须和数组严格对应:query("SELECT * FROM logs WHERE level = $1 AND ts > $2", ['error', new Date(...)])
  • SQL Server(node-mssql):用 @param,但记得 ps.prepare() 后要 ps.unprepare(),否则连接池资源会泄漏

表名、字段名、ORDER BY 子句这些结构部分,数据库驱动根本不支持参数化,只能靠白名单硬编码,没有例外。

别信 escape(),它只是补救手段

mysql.escape() 或 connection.escape() 看起来方便,但它不是参数化查询,只是字符串转义。它对数字、布尔、日期等类型有固定规则,但一旦遇到嵌套对象、数组或特殊编码,行为可能不符合预期;而且它完全不管上下文——你在 WHERE 里用它,不代表在 ORDER BY 或 INSERT INTO ... VALUES 里也能照搬。

  • 它不能替代占位符,尤其在复杂条件(如 IN (?))中,数组展开逻辑容易出错
  • 日志记录、错误信息、监控埋点里如果还拼了原始 SQL 字符串,escape() 也救不了
  • 真正难的不是写对一行 query(),而是确保所有分支路径(if/else、异常处理、调试输出)都没漏掉参数化

白名单校验 + 参数化占位符 + 模型方法优先,这三件事做全了,SQL 注入才真的退场。其他都是临时胶带。

相关专题

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

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

2023.10.12

4743

8

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

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

2023.10.27

971

4

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

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

2024.02.23

1249

5

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

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

2024.03.06

6761

10

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

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

2024.03.06

3483

4

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

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

2024.04.07

6740

11

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

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

2024.04.29

9321

6

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

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

2024.04.29

1270

5

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

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

2024.04.29

1112

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习