51ak带你看MYSQL5.7源码4:实现SQL黑名单功能
博客迁移至:
从事DBA工作多年
MYSQL源码也是头一次接触
尝试记录下自己看MYSQL5.7源码的历程
申明:个人Python编程很溜,但是C++还停在白痴水平,源码理解方面有点弱,如发现有错误的地方,轻喷。
博客的题目是看源码,实际上可能会发现在不停的在改源码,没办法,手贱,不改不舒服。
目录:
51ak带你看MYSQL5.7源码1:main入口函数 (2018-03-21)
51ak带你看MYSQL5.7源码2:编译现有的代码 (2018-03-22)
51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本 (2018-03-23)
51ak带你看MYSQL5.7源码4:实现SQL黑名单功能(2018-04-11)
上一篇我们实现了,屏掉了MYSQL的DELTE语句的执行功能。
想了想这种改动太暴力了,不够优雅
现在我们要改变一下思路,做一个MYSQL的黑名单功能。
什么叫黑名单呢?
就是说属于屏掉在带黑名单里的关键字的SQL的执行
举例来说,
我们发现有个上线故障,导致有大量的SQL在查一个表 SELECT * FROM A WHERE ...
我们设置个黑名单: SELECT * FROM A
那么所有这种查询将不执行,直接返回,这对线上服务的快速缓解问题是有很大帮助的。
现在我们来尝试在源码上定制这个功能
首先按上一篇文章说的,找到sql_parse.cc 定位 到这个函数 void mysql_parse(THD *thd, Parser_state *parser_state
通过 这一行
void mysql_parse(THD *thd, Parser_state *parser_state)
{
int error MY_ATTRIBUTE((unused));
DBUG_ENTER("mysql_parse");
DBUG_PRINT("mysql_parse", ("query: '%s'", thd->query().str)); DBUG_EXECUTE_IF("parser_debug", turn_parser_debug_on();); #这里加我们的代码,目的是如果判断SQL文本中有指定字符abc ,直接退出。
std::string str_blacklist="abc";
std::string sqlstr_dba= thd->query().str;
std::string::size_type idx_blacki = sqlstr_dba.find( str_blacklist ); if ( idx_blacki != std::string::npos )
{
DBUG_PRINT("find blacklist sqlst",("query: '%s'", thd->query().str));
return ;
}
#这里结束
mysql_reset_thd_for_next_command(thd);
lex_start(thd);
编译安装,随便 执行个SQL发现没问题,只要带上abc这个字符,立即退出,黑名单功能实现
但是我们不可能每次修改SQL黑名单都要修改一次MSYQL源码,这不现实,所以需要把这个黑名单做成系统变量 variables
这里注意了,一共是两个地方需要修改,全局变量定义放在mysqd.cc中 而变量的值初始化在sys_vars.cc中
打开mysqd.cc 加上
static Sys_var_charptr Sys_black_sqlstr(
"black_sqlstr",
"the black list sqlstr --by 51ak ",
READ_ONLY GLOBAL_VAR(opt_black_sqlstr), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT());
现在我们完成了增加一个系统变量,也完成了SQL黑名单的判断,把这两个结合起来。执行SQL时如果文本中包含black_sqlstr中的文本,则强行退出执行。
我们去修改mysql_parse.cc
std::string str_blacklist=opt_black_sqlstr;
std::string sqlstr_dba= thd->query().str;
std::string::size_type idx_blacki = sqlstr_dba.find( str_blacklist ); if ( idx_blacki != std::string::npos )
{
DBUG_PRINT("find blacklist sqlst",("query: '%s'", thd->query().str));
return ;
}
接下来编译,安装
修改配置文件 ,默认是/etc/my.cnf
增加一个变量:black_sqlstr=order

进入MYSQL,试一下:
#查一下我们设置的变量
mysql> show global variables like '%black%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| black_sqlstr | order |
+---------------+-------+
1 row in set (0.02 sec) #尝试触发黑名单
mysql> select 'order';
ERROR 2013 (HY000): Lost connection to MySQL server during query #尝试触发黑名单
mysql> select * from dba_test.op_log where content like '%order%';
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>
好,一个SQL黑名单功能 已经完成,
通过这个例子,做了两个层面的修改,定义一个Mysql变量,使用这个变量来完成SQL限定的功能。
大家举一反三,发现更多的利用方式
今天到此为止。
51ak带你看MYSQL5.7源码4:实现SQL黑名单功能的更多相关文章
- 51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- 51ak带你看MYSQL5.7源码2:编译现有的代码
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- 51ak带你看MYSQL5.7源码1:main入口函数
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- Chrome自带恐龙小游戏的源码研究(七)
在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...
- Chrome自带恐龙小游戏的源码研究(完)
在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...
- Chrome自带恐龙小游戏的源码研究(六)
在上一篇<Chrome自带恐龙小游戏的源码研究(五)>中实现了眨眼睛的恐龙,这一篇主要研究恐龙的跳跃. 恐龙的跳跃 游戏通过敲击键盘的Spacebar或者Up来实现恐龙的跳跃.先用一张图来 ...
- Chrome自带恐龙小游戏的源码研究(四)
在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高. ...
- Chrome自带恐龙小游戏的源码研究(一)
目录 Chrome自带恐龙小游戏的源码研究(一)——绘制地面 Chrome自带恐龙小游戏的源码研究(二)——绘制云朵 Chrome自带恐龙小游戏的源码研究(三)——昼夜交替 Chrome自带恐龙小游戏 ...
- 带你逐行阅读redux源码
带你逐行阅读redux源码 redux版本:2019-7-17最新版:v4.0.4 git 地址:https://github.com/reduxjs/redux/tree/v4.0.4 redux目 ...
随机推荐
- uni-app 调用支付宝支付
本文讲解 uni-app如何调用支付宝进行支付,服务端为 .net编写. 客户端:uni-app 编写 1.根据服务端生成的订单信息发起支付. 服务端:.net 编写 1.生成订单信息.2.接收支 ...
- HTML5+CSS3(3)
一.CSS3新增属性用法整理 1.box-shadow(阴影效果) 2.border-color(为边框设置多种颜色) 3.border-image(图片边框) 4.text-shadow(文本阴影) ...
- Exp6 信息搜集与漏洞扫描 20164313 杜桂鑫
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 1.使用搜索引擎 在百度搜索栏内输入 site:com filetype:doc 北京电子科技学院 ...
- IVIEW TREE问题总结
1. API得到的tree数组数据,在前端构造成iview tree格式,无法编辑或者无法再次选中的问题: 由于VUE不能检测到数据或对象的变动,官网文档有解释 由于 JavaScript 的限制,V ...
- spring boot 入门(一)
转自构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. ...
- __name__ __main__ 作用
1 __name__ 在自己文件下面执行 就显示__main__ 2 如果__name__是在其他文件里面,然后通过当前文件调用到其他文件执行,就会显示的当前文件路劲的文件名结果: if __name ...
- Spring切面编程实践【原创】
定义 什么叫Spring面向切面编程(AOP),请自行百度,这边就不做详细介绍了. 场景 有两个对象,字典和工程信息Bean,每次新增或修改对象时,记录新增和修改的时间. 基类定义 package m ...
- logstash 切分tomcat日志
以下配置是logstash切分tomcat catalina.out日志. http://grok.qiexun.net/ 分割时先用这个网站测试下语句对不对,能不能按需切割日志. input { ...
- 发现一个好工具RenderDoc
逛VULKAN官网时,工具中提到RenderDoc这个东西,百度了下,是专为图形程序员用的,可以集成到VS,或U3D中,收藏先. 参考链接
- MySQL8.0.x免安装配置
目录 概述 下载 配置环境变量 编辑配置文件 初始化MySQL 安装MySQL系统(Windows)服务 初始化MySQL 启动MySQL 修改默认密码 开启远程登录 概述 MySQL从5.7一下子跳 ...