Node.js后端如何对客户端输入的JSON安全转换并防范SQL注入?

落宇酱_9211

落宇酱_9211

2026-09-28

524人浏览

原创

json解析本身不导致sql注入,但解析后字段值若拼入sql语句则立即中招;必须全程使用参数化查询,动态字段名需白名单校验,输入验证应分层实施且不替代参数化。

node.js后端如何对客户端输入的json安全转换并防范sql注入?

JSON解析本身不产生SQL注入,但后续把解析出的字段值拼进SQL语句就会立刻中招——唯一安全做法是所有字段值进SQL前必须走参数化路径,不能出现在SQL字符串里。

为什么JSON.parse()之后还可能被注入

很多人误以为JSON校验=安全过滤,其实JSON.parse()只是把字符串转成JS对象,字段值仍是原始字符串,没做任何转义或类型约束。攻击者提交{"id": "1 OR 1=1"},后端若写"SELECT * FROM users WHERE id = " + data.id,数据库收到的就是SELECT * FROM users WHERE id = 1 OR 1=1。

常见错误场景包括:

  • 用JSON Schema校验了id是数字类型,但攻击者用"1; DROP TABLE logs;"绕过(Schema不校验内容语义)
  • 对sort_by、filter这类“非核心字段”放松处理,结果它们被拼进ORDER BY或WHERE子句
  • 前端传了嵌套结构如{"user": {"name": "admin' --"}},后端直接取data.user.name拼SQL

Node.js中安全提取JSON字段的实操要点

关键不是“怎么解析JSON”,而是“解析后怎么用”。必须切断字符串拼接路径:

Aria2 Json Rpc
Aria2 Json Rpc

通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

下载
  • 所有从req.body取的值,进SQL前一律走参数化占位符:pool.query("SELECT * FROM t WHERE name = ?", [data.name])(MySQL)或pool.query("SELECT * FROM t WHERE name = $1", [data.name])(PostgreSQL)
  • 动态字段名(如ORDER BY的列名)无法参数化,必须用白名单硬编码:const allowedSorts = ["created_at", "score"]; if (!allowedSorts.includes(data.sort_by)) throw new Error("Invalid sort field");
  • 避免用lodash.set或obj[key] = value动态赋值到查询对象,容易引入原型污染或字段覆盖风险

ORM场景下仍需警惕的危险操作

Sequelize、TypeORM等框架默认防注入,但开发者一不小心就掉坑里:

  • 禁用raw: true或literal:如User.findAll({ where: sequelize.literal(`name = '${data.name}'`) })直接回归拼接模式
  • 避免query()方法手写SQL:即使用了sequelize.query("SELECT * FROM users WHERE id = ?", { replacements: [data.id] })也比拼接强,但优先走模型方法
  • 注意include关联查询中的where条件,同样要确保传入的是变量而非字符串拼接结果

输入验证该放在哪一层

验证不是可选动作,但位置很关键:

  • JSON Schema或Joi校验放在路由入口(如Express中间件),用于快速拦截明显非法结构(空值、超长、类型错),但它不替代参数化
  • 字段长度、格式正则(如邮箱/^[^\s@]+@[^\s@]+\.[^\s@]+$/)应在业务逻辑层做二次确认,防止绕过
  • 不要在验证层做SQL转义(如mysql.escape()),那会和参数化冲突,且易遗漏;转义只在极少数必须拼接的场景(如日志记录)中使用

最常被忽略的一点:JSON字段里的__proto__、constructor这类属性,如果被合并进查询对象,可能污染原型链并间接影响权限判断逻辑——解析后应先用Object.keys()或白名单过滤掉敏感键名。

相关文章

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

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

下载

相关标签:

js node.js json node sql注入

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

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2143

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5730

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5026

10

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

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

2023.10.12

3823

8

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

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

2023.10.27

811

4

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

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

2024.02.23

989

5

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

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

2024.03.06

5641

10

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

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

2024.03.06

2603

4

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

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

2024.04.07

5620

11

热门下载

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

精品课程

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

共101课时 | 20.6万人学习

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

共39课时 | 4.7万人学习