为什么JavaScript前端拼接SQL是危险的_将逻辑迁移至后端并使用参数化

轻伟大大_9033

轻伟大大_9033

2026-05-20

853人浏览

原创

前端拼接sql并发送后端执行等于彻底放弃防护,因用户可绕过前端校验直接构造恶意请求,后端若未强制参数化或白名单校验,将导致sql注入、数据泄露甚至删库;必须后端迁移至预编译查询,并对表名、字段名等结构参数严格白名单控制。

为什么javascript前端拼接sql是危险的_将逻辑迁移至后端并使用参数化

前端 JavaScript 拼接 SQL 并发送给后端执行,等于把数据库的解析权和执行权直接交到用户手里——这不是“不安全”,而是根本没设防。

前端拼接 SQL 的实际后果

你可能以为只是“把字符串发过去”,但只要后端不做校验、不强制参数化,fetch('/api/user', { method: 'POST', body: JSON.stringify({ sql: "SELECT * FROM users WHERE id = " + userInput }) }) 这种调用,就等同于在数据库前敞开大门。

常见错误现象:

  • 用户输入 1 OR 1=1,后端直接执行 SELECT * FROM users WHERE id = 1 OR 1=1,返回全部用户
  • 输入 1; DROP TABLE users--,若后端用 mysql2.query() 执行多语句,表真被删
  • 前端用模板字符串拼接字段名或表名(如 `SELECT * FROM ${tableName}`),后端未白名单校验就执行,租户隔离彻底失效

为什么不能靠前端过滤或“只传结构”

任何前端校验都可绕过:禁用 JS、抓包改请求、用 curl 直接 POST。所谓“前端只传字段名和值”,一旦后端动态拼接,风险照旧。

典型翻车场景:

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载
  • 前端传 { table: 'logs_202605', condition: { level: 'error' } },后端写成 db.query(`SELECT * FROM ${data.table} WHERE level = '${data.condition.level}'`)
  • 用 JSON.stringify() 包一层,不代表 SQL 就安全了——后端反序列化后仍可能拼接
  • 声称“只在内部系统用”,但内网扫描、员工终端中毒、SSO 泄露都会让攻击面扩大

迁移后端 + 参数化的实操要点

迁移不是简单把代码剪切粘贴到 Node.js 或 Python 里,关键在“如何绑定”。不同语言/驱动行为差异大,容易踩坑:

  • mysql2.query("SELECT * FROM u WHERE n = ?", [req.body.name]) 安全;但 mysql2.query("SELECT * FROM u WHERE n = " + req.body.name) 危险
  • PostgreSQL 必须用 $1, $2 占位符:client.query("SELECT * FROM logs WHERE level = $1", ["error"]);用 ? 会报错
  • MyBatis 中 #{} 是参数化,${} 是字符串替换——后者等价于拼接,禁用
  • ORM 如 Sequelize 的 .raw()、SQLAlchemy 的 text() 需显式传参:db.session.execute(text("UPDATE logs SET status = :s"), {"s": status}),不能用 f-string

动态表名/字段名这类“不可参数化”的情况怎么处理

表名、列名、排序方向(ASC/DESC)、LIMIT 偏移量等,数据库本身不支持占位符,必须走白名单或严格正则校验。

例如:

  • 允许切换的报表表名限定为 ['sales_2025', 'sales_2026', 'users_active'],收到 req.body.table 后先 if (!allowedTables.includes(tableName)) throw new Error('Invalid table')
  • 排序字段只允许 ['id', 'created_at', 'name'],值来自枚举而非用户输入
  • LIMIT 的数字必须是整数且有上限:Math.min(parseInt(req.query.limit) || 10, 100)

最容易被忽略的是日志记录环节:哪怕查询本身参数化了,如果把原始请求体(含恶意输入)原样记进数据库日志表,下一次“查日志”功能就可能触发二次注入——日志字段也要当数据处理,不能当 SQL 片段拼接。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

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

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

下载

相关标签:

javascript java 前端

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

相关专题

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

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

2023.08.11

2263

5

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

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

2024.03.19

5970

13

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

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

2024.03.19

5306

10

python是前端还是后端
python是前端还是后端

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

2023.08.11

2263

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4863

6

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

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

2024.03.19

5970

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5458

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

763

5

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

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

2023.10.12

3983

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习