为什么开发者不应信任前端传入的SQL条件_在服务端实施强制类型转换

老丽姑娘_9194

老丽姑娘_9194

2026-04-23

368人浏览

原创

必须使用参数化查询而非字符串拼接——前端校验可被绕过,json.stringify不防注入,parseint等类型转换不能替代预编译,枚举字段需白名单+参数化,动态sql部分须严格映射。

为什么开发者不应信任前端传入的sql条件_在服务端实施强制类型转换

前端传来的任何数据,包括所谓“SQL条件”,都不应被直接拼接到查询中——这不是谨慎,而是底线。哪怕你加了前端校验、按钮禁用、请求拦截,攻击者只要打开 DevTools 改一行 fetch 就能绕过全部。

为什么 JSON.stringify 包裹的 SQL 条件仍是危险的

常见误区是:把用户选的筛选项(如 { status: 'active', category_id: 12 })转成 JSON 字符串,再让后端“解析后拼进 SQL”。这本质上只是换了一种方式传递原始输入,没解决根本问题。

  • 攻击者可手动构造请求,把 category_id 改成 "12 OR 1=1 --",后端若用 JSON.parse() 再字符串拼接,照样触发注入
  • JSON.parse 不校验语义,只保证格式合法;"true"、"null"、"SELECT * FROM users" 都是合法 JSON 字符串
  • 一旦服务端逻辑里出现 WHERE category_id = ${obj.category_id} 这类模板拼接,类型转换就完全失效

parseInt 和 Number() 不能替代参数化查询

强制类型转换常被误当作“防注入手段”:比如对 ID 字段调用 parseInt(req.query.id),再塞进 SQL。它确实能拦住部分字符串型注入,但远不够用。

前端设计优化skill
前端设计优化skill

前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。

下载
  • parseInt('123abc') 返回 123,看似安全,但若字段本应是字符串(如用户名),parseInt('admin\' OR 1=1--') 会返回 NaN,而很多代码没做 isNaN 判断就继续执行,反而引发逻辑错误或空值绕过
  • 浮点数、科学计数法(1e5)、负号(-1)等都可能被合法解析,但业务上未必允许
  • 类型转换发生在拼接前,但拼接本身仍是硬编码 SQL —— 只要没进预编译流程,数据库仍会按 SQL 语法解析整条语句

真正有效的强制类型约束必须绑定到参数化查询上下文

类型转换只有和预编译语句结合才有意义。例如 Node.js 的 pg 库中,client.query('SELECT * FROM users WHERE id = $1', [req.query.id]) 这个 $1 占位符,才是类型安全的起点。

  • 你传入的 req.query.id 会被驱动自动映射为 PostgreSQL 的 integer 类型(如果字段是 INT),超出范围或非法值会抛出明确错误,而不是静默截断或转换
  • MySQL 的 mysql2 中使用 connection.execute('SELECT * FROM users WHERE status = ?', [req.query.status]),? 占位符确保 status 被当作文本字面量,不会参与语法解析
  • 关键点在于:类型判断由数据库驱动在协议层完成,不是靠 JS 的 parseInt 或正则“猜”出来的

容易被忽略的边界:枚举字段和布尔条件

开发者常对数字 ID 做类型检查,却放行 status、sort_by、order 这类字符串字段,以为“只允许几个固定值”就够了。

  • 写 if (['active', 'inactive'].includes(req.query.status)) 是必要但不充分的——若后续拼接时写成 WHERE status = '${req.query.status}',攻击者只需把请求改成 ?status=active' -- 就能注释掉后面条件
  • 更安全的做法是:先白名单校验,再通过参数化查询传入,且绝不拼接字段名或操作符(如 ORDER BY ${req.query.sort_by} 是高危模式)
  • 涉及动态列名、表名、排序方向时,必须用严格白名单映射,例如 const sortMap = { created_at: 'created_at', updated_at: 'updated_at' },然后取 sortMap[req.query.sort_by] || 'id',再拼进 SQL(此时已脱离用户输入控制)

最危险的不是不会写参数化查询,而是写了参数化查询,却在某个 if 分支里偷偷用字符串拼接补了一条“临时 SQL”。这类漏洞往往藏在分页逻辑、导出功能或管理后台的高级搜索里,上线后很久才暴露。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

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

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

下载

相关标签:

前端

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

相关专题

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

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

2023.08.11

2523

5

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

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

2023.10.09

5443

6

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

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

2024.03.19

6470

13

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

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

2024.03.22

6098

10

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

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

2024.05.22

863

5

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

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

2023.10.12

4343

8

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

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

2023.10.27

911

4

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

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

2024.02.23

1129

5

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

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

2024.03.06

6261

10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程