首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ProxySQL 设置拦截危险SQL

ProxySQL 设置拦截危险SQL

原创
作者头像
贺春旸的技术博客
发布2024-08-02 09:17:38
发布2024-08-02 09:17:38
5400
举报
文章被收录于专栏:DBA 平台和工具DBA 平台和工具

操作 MySQL 数据库是十分危险的,生产环境,经常会有人因手滑把数据误改或者误删,为此可以制定一些规则来减少风险。

我的规则是:

  • 禁止执行没有 WHERE 条件的删除操作,例如:DELETE FROM <表名>
  • 禁止执行等同于删除全表数据的删除操作,例如:DELETE FROM <表名> WHERE 1=1
  • 禁止执行没有 WHERE 条件的更新操作,例如:UPDATE <表名> SET <字段名> = <值>
  • 禁止执行等同于更新全表数据的更新操作,例如:UPDATE <表名> SET <字段名> = <值> WHERE 1=1

具体实施步骤

1.访问ProxySQL的6032管理端口

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

代码语言:sql
复制
-- 插入新的DELETE规则 (无WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) 
VALUES (101, 1, '^DELETE\s+FROM\s+[^\s]+\s*$', 'DELETE语句必须包含有效的WHERE条件.', 1);

-- 插入新的DELETE规则 (无效WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) 
VALUES (102, 1, '^DELETE\s+FROM\s+[^\s]+\s+WHERE\s+[0-9]+=[0-9]+$', 'DELETE 语句必须包含有效的WHERE条件.', 1);

-- 插入新的UPDATE规则 (无WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply)
VALUES (103, 1, '^UPDATE\s+[^\s]+\s+SET\s+[^\s]+\s*$', 'UPDATE语句必须包含WHERE条件', 1);

-- 插入新的UPDATE规则 (无效WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply)
VALUES (104, 1, '^UPDATE\s+[^\s]+\s+SET\s+[^\s]+\s+WHERE\s+[0-9]+=[0-9]+$', 'UPDATE 语句必须包含有效的WHERE条件', 1);

-- 注释:
-- 1. 规则1和3匹配不包含WHERE子句的DELETE和UPDATE语句
-- 2. 规则2和4匹配包含无效WHERE条件的DELETE和UPDATE语句
-- 3. 无效WHERE条件包括: 数字相等、TRUE、FALSE

-- 加载和保存规则
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

使用

2.DBA、运维或者研发直接访问ProxySQL的6033端口

mysql -u rd -p123456 -h 127.0.0.1 -P6033

当设定好的规则被触发时,ProxySQL会将其拦截,如下图所示:

ProxySQL 拦截危险SQL语句
ProxySQL 拦截危险SQL语句

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 操作 MySQL 数据库是十分危险的,生产环境,经常会有人因手滑把数据误改或者误删,为此可以制定一些规则来减少风险。
  • 具体实施步骤
    • 1.访问ProxySQL的6032管理端口
  • 使用
    • 2.DBA、运维或者研发直接访问ProxySQL的6033端口
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档