如何在SQL中编写触发器防止用户绕过前端校验篡改金额

夏静小哥_9711

夏静小哥_9711

2026-11-05

606人浏览

原创

必须用 BEFORE INSERT 和 BEFORE UPDATE 触发器,因校验需在数据写入前阻止非法值;金额校验应使用数值范围而非正则;抛异常须用 SIGNAL/RAISE 等标准语法并带明确错误信息;批量更新等场景需结合 OLD/NEW 值做相对变化校验。

如何在sql中编写触发器防止用户绕过前端校验篡改金额

触发器该放在 UPDATE 还是 BEFORE INSERT?

必须用 BEFORE INSERT 和 BEFORE UPDATE,不能用 AFTER。因为校验失败要阻止写入,AFTER 触发时数据已落库,再抛错也晚了——事务虽可回滚,但日志、主从同步、应用层感知都已发生偏差。

常见错误是只写 UPDATE 触发器,漏掉 INSERT 场景。比如用户直接 INSERT 一条伪造的高金额记录,绕过前端新增表单的限制。

  • BEFORE INSERT 拦截非法初始值
  • BEFORE UPDATE 拦截后续篡改(如后台脚本、SQL 工具直连)
  • 两个触发器逻辑应一致,避免校验缺口

金额字段校验该用正则还是数值范围?

用数值比较,别用正则。正则匹配字符串易被绕过(如 '100.00e0'、'+100'),且无法防止科学计数法或超精度浮点表示。数据库层面应信任类型系统:DECIMAL(10,2) 字段就按数值处理。

典型校验逻辑:金额必须 ≥ 0 且 ≤ 99999999.99(根据业务定上限)。注意不要硬写死 99999999.99,建议提取为常量或配置表字段,方便后续调整。

  • 检查 NEW.amount 或 NEW.amount > 99999999.99
  • 避免用 ROUND(NEW.amount, 2) != NEW.amount 校验小数位——DECIMAL 类型本身已保证精度,此判断反而可能因隐式转换出错
  • 若业务允许负数(如退款),则下限改为业务规则值,而非简单 0

触发器里抛异常该用 SIGNAL 还是 RAISE?

MySQL 5.5+ 用 SIGNAL SQLSTATE '45000';PostgreSQL 用 RAISE EXCEPTION;SQL Server 用 THROW。语法不通用,迁移时容易翻车。最稳妥的是统一用带明确信息的自定义错误码:

精英前端设计-专业版
精英前端设计-专业版

企业级前端设计系统,支持多页面应用、React/Vue组件、品牌一致性与高级动效编排。

下载
-- MySQL 示例
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Amount out of allowed range: [0, 99999999.99]';

关键点:错误信息必须包含具体范围,方便 DBA 或运维快速定位策略边界,而不是只写 “invalid amount”。另外,别依赖 ERROR_MESSAGE() 在应用层解析——不同驱动对 SIGNAL 的封装程度不一,应以 SQLSTATE 码为准做分类处理。

  • SQLSTATE '45000' 是标准未定义异常,兼容性最好
  • 避免用 SELECT 1/0 等副作用方式“模拟报错”,不可控且难维护
  • 测试时务必用命令行直连执行 INSERT/UPDATE,绕过 ORM 缓存和中间件拦截

为什么触发器拦不住某些 UPDATE 场景?

常见漏网之鱼:批量更新(UPDATE ... SET amount = amount * 1.1)、子查询赋值(UPDATE t1 SET amount = (SELECT max(amount) FROM t2))、以及触发器未覆盖的字段别名或计算列。根本原因是触发器只看到 NEW.amount 的最终值,看不到来源逻辑。

所以不能只校验单次赋值结果,还得结合上下文约束。例如:禁止金额变动超过 ±10%(相比原值),或要求必须提供修改理由字段(update_reason 非空)。

  • 在 BEFORE UPDATE 中对比 OLD.amount 和 NEW.amount
  • 若业务允许合理浮动,用相对变化率而非绝对阈值
  • 注意 NULL 处理:若 OLD.amount 为 NULL,NEW.amount 却非 NULL,这属于初始化,不应套用浮动规则

真正难防的是有 DBA 权限的人禁用触发器或绕过权限体系直写表。触发器只是最后一道校验防线,不是访问控制替代品。它的价值在于让“误操作”变难,而非让“恶意提权”变不可能。

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

相关文章

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

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

下载

相关标签:

前端

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

相关专题

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

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

2023.08.11

2843

5

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

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

2023.10.09

6183

6

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

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

2024.03.19

7110

13

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

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

2024.03.22

6918

10

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

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

2024.05.22

983

5

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

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

2023.10.12

4763

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

6781

10

热门下载

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

精品课程

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