Soar项目中添加一条新的SQL审核规则示例
soar是一个开源的SQL规则审核工具,是一个go语言项目,可以直接编译构建成一个可执行程序,而且是一个命令行工具,我们可以利用archey来调用soar进行sql规则审核以及sql的分析,包括执行计划的查看及sql建议等。
soar中已经有很多规则了,现在来添加一条soar中没有的新的sql审核规则,例如一条新的审核规则:多表关联必须有关联条件,禁止出现笛卡尔积
我的思路是校验联表查询不允许没有on和useing关键词,同时不允许混用逗号和 ANSI 模式
首先在advisor包下的rule.go文件中添加规则说明
//多表关联必须有关联条件,禁止出现笛卡尔积"JOI.009": {Item: "JOI.009",Severity: "L4",Summary: "多表关联必须有关联条件,禁止出现笛卡尔积",Content: `多表关联必须有关联条件,禁止出现笛卡尔积`,Case: "SELECT s,p,d FROM tb1,tb2 ",Func: (*Query4Audit).RuleJoinQueryNoCondition,},
同时会利用到本来用的联表的规则1
"JOI.001": {Item: "JOI.001",Severity: "L2",Summary: "JOIN 语句混用逗号和 ANSI 模式",Content: `表连接的时候混用逗号和 ANSI JOIN 不便于人类理解,并且MySQL不同版本的表连接行为和优先级均有所不同,当 MySQL 版本变化后可能会引入错误。`,Case: "select c1,c2,c3 from t1,t2 join t3 on t1.c1=t2.c1,t1.c3=t3,c1 where id>1000",Func: (*Query4Audit).RuleCommaAnsiJoin,},
然后来添加新的约束规则方法:
在advisor包下的heuristic.go文件中加上新的方法:
//判断联表查询中是否有关联条件 on 或者using 对应需求表中规则编号70
func (q *Query4Audit) RuleJoinQueryNoCondition() Rule {var rule = q.RuleOK()err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {switch n := node.(type) {case *sqlparser.Select:ansiJoin := falsecommaJoin := falsefor _, f := range n.From {switch f.(type) {case *sqlparser.JoinTableExpr:ansiJoin = truecase *sqlparser.AliasedTableExpr:commaJoin = true}}if ansiJoin && commaJoin {rule = HeuristicRules["JOI.001"]return false, nil}case *sqlparser.JoinTableExpr: // 处理 JOIN 表达式if n.Condition.On == nil || len(n.Condition.Using) == 0 { // 检查是否有 ON 或 USING 条件rule = HeuristicRules["JOI.009"] // 更新规则return false, nil}}return true, nil}, q.Stmt)common.LogIfError(err, "")return rule
}
今天还加了几个其他的规则判断如下:rule.go文件中
//为每个字段应添加注释,对应需求表中的开发规则编号15"CLA.011": {Item: "CLA.011",Severity: "L1",Summary: "表中的每个字段都应该添加注释",Content: `为表添加注释能够使得表的意义更明确,从而为日后的维护带来极大的便利。`,Case: "CREATE TABLE `test1` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`c1` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8",Func: (*Query4Audit).RuleTblCommentCheck,},//禁止查询时 select * 对应开发需求中的规则编号49"COL.001": {Item: "COL.001",Severity: "L1",Summary: "SELECT语句必须指定具体字段名称,禁止写成 select*",Content: `当表结构变更时,使用 * 通配符选择所有列将导致查询的含义和行为会发生更改,可能导致查询返回更多的数据。`,Case: "select * from tbl where id=1",Func: (*Query4Audit).RuleForbiddenSelectStar,}, //建表语句以及alter语句修改表结构时候自增列字段使用bigint,.禁止使用int类型 对应需求表中的规则编号19"COL.020": {Item: "COL.020",Severity: "L2",Summary: "自增列字段使用bigint,.禁止使用int类型,防止存储溢出",Content: `自增列字段使用bigint,.禁止使用int类型,防止存储溢出`,Case: "create table test(`id` int(11) NOT NULL AUTO_INCREMENT)",Func: (*Query4Audit).RuleAutoIncShouldBigint,},//建表语句以及修改表结构时中禁止使用float、double类型,小数类型使用decimal类型 对应需求表中的规则编号8"COL.021": {Item: "COL.021",Severity: "L2",Summary: "建表语句以及修改表结构时中禁止使用float、double类型,小数类型使用decimal类型 ",Content: `建表语句以及修改表结构时中禁止使用float、double类型,小数类型使用decimal类型`,Case: "create table test(`id` int(11) NOT NULL AUTO_INCREMENT)",Func: (*Query4Audit).RuleFloatDoubleCheck,},
对应的方法:heuristic.go文件中:
// RuleTblCommentCheck CLA.011 检查表中每个字段是否都添加注释,对应需求表中的开发规则编号15
func (q *Query4Audit) RuleTblCommentCheck() Rule {var rule = q.RuleOK()switch node := q.Stmt.(type) {case *sqlparser.DDL:if strings.ToLower(node.Action) != "create" {return rule}if node.TableSpec == nil {return rule}if options := node.TableSpec.Options; options == "" {rule = HeuristicRules["CLA.011"]} else {//正则表达式匹配comment,不区分大小写reg := regexp.MustCompile("(?i)comment")if !reg.MatchString(options) {rule = HeuristicRules["CLA.011"]}}}return rule
}// RuleForbiddenSelectStar COL.001 禁止使用select * 对应需求表中的开发规则编号49
func (q *Query4Audit) RuleForbiddenSelectStar() Rule {var rule = q.RuleOK()// 先把count(*)替换为count(1)re := regexp.MustCompile(`(?i)count\s*\(\s*\*\s*\)`)sql := re.ReplaceAllString(q.Query, "count(1)")stmt, err := sqlparser.Parse(sql)if err != nil {common.Log.Debug("RuleSelectStar sqlparser.Parse Error: %v", err)return rule}err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {switch node.(type) {case *sqlparser.StarExpr:rule = HeuristicRules["COL.001"]return false, nil}return true, nil}, stmt)common.LogIfError(err, "")return rule
}// 建表以及修改表字段时候自增列字段使用bigint,.禁止使用int类型 对应需求表中的规则编号19
func (q *Query4Audit) RuleAutoIncShouldBigint() Rule {var rule = q.RuleOK()switch q.Stmt.(type) {case *sqlparser.DDL:for _, tiStmt := range q.TiStmt {switch node := tiStmt.(type) {case *tidb.CreateTableStmt:for _, col := range node.Cols {if col.Tp == nil {continue}for _, opt := range col.Options {if opt.Tp == tidb.ColumnOptionAutoIncrement {if col.Tp.Tp != mysql.TypeLong { // 检查是否为 bigint 类型rule = HeuristicRules["COL.020"]break}}if rule.Item == "COL.020" {break}}}case *tidb.AlterTableStmt:for _, spec := range node.Specs {switch spec.Tp {case tidb.AlterTableChangeColumn, tidb.AlterTableAlterColumn,tidb.AlterTableModifyColumn, tidb.AlterTableAddColumns:for _, col := range spec.NewColumns {if col.Tp == nil {continue}for _, opt := range col.Options {if opt.Tp == tidb.ColumnOptionAutoIncrement {if col.Tp.Tp != mysql.TypeLong { // 检查是否为 bigint 类型rule = HeuristicRules["COL.020"]break}}if rule.Item == "COL.020" {break}}}}}}}}return rule
}//建表语句以及修改表结构时中禁止使用float、double类型,小数类型使用decimal类型 对应需求表中的规则编号8
func (q *Query4Audit) RuleFloatDoubleCheck() Rule {var rule = q.RuleOK()switch q.Stmt.(type) {case *sqlparser.DDL:for _, tiStmt := range q.TiStmt {switch node := tiStmt.(type) {case *tidb.CreateTableStmt:for _, col := range node.Cols {if col.Tp == nil {continue}if col.Tp.Tp == mysql.TypeFloat || col.Tp.Tp == mysql.TypeDouble {rule = HeuristicRules["COL.021"]break}}case *tidb.AlterTableStmt:// 对 ALTER TABLE 语句的类似检查for _, spec := range node.Specs {switch spec.Tp {case tidb.AlterTableChangeColumn, tidb.AlterTableAlterColumn,tidb.AlterTableModifyColumn, tidb.AlterTableAddColumns:for _, col := range spec.NewColumns {if col.Tp == nil {continue}if col.Tp.Tp == mysql.TypeFloat || col.Tp.Tp == mysql.TypeDouble {rule = HeuristicRules["COL.021"]break}}}}}}}return rule
}
通过代码可以看出一些规则实际上是调用了tidb的审核分析工具包进行处理的。sql语句的解析拆分各个部分当然还是用的sqlparser,sqlparser又在vitess模块依赖包下
拆分sql语句靠sqlparser,分析sql则依赖tidb(pingcap公司产品)的相关模块工具依赖包
比如判断mysql的字段的各种数据类型 ,再比如判断sql语句属于类名类型
而且tidb主要用于分析mysql语句
相关文章:
Soar项目中添加一条新的SQL审核规则示例
soar是一个开源的SQL规则审核工具,是一个go语言项目,可以直接编译构建成一个可执行程序,而且是一个命令行工具,我们可以利用archey来调用soar进行sql规则审核以及sql的分析,包括执行计划的查看及sql建议等。 soar中已…...
RISC-V开发 linux下GCC编译自定义指令流程笔记
第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言 第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入 第三步:RISC-V开发环境的搭建 C语言插入汇编 GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了…...
java代码是如何与数据库通信的?
Java代码与数据库通信的过程主要通过Java Database Connectivity(JDBC)来实现。JDBC是Java与数据库之间的标准接口,提供了用于执行SQL语句和处理数据库结果的API。以下是Java代码与数据库通信的详细步骤: 一、导入JDBC库 在Java…...
gateway--网关
在微服务架构中,Gateway(网关)是一个至关重要的组件,它扮演着多种关键角色,包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口: Gateway作为微服务的统一入口,…...
北京数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
随着北京数字孪生工业互联网可视化技术的深入应用,新型工业化智能制造工厂正逐步迈向智能化、高效化的全新阶段。这项技术不仅实现了物理工厂与数字世界的精准映射,更通过大数据分析、人工智能算法等先进手段,为生产流程优化、资源配置合理化…...
土地规划与区域经济发展:筑基均衡未来的战略经纬
在新时代背景下,土地规划不仅是空间布局的艺术,更是推动区域经济均衡发展的关键引擎。土地资源的合理配置对于激发区域潜能、促进经济结构优化有着重要意义。本文将深入剖析土地规划如何成为促进区域经济均衡发展的强大动力。 一、土地规划与区域经济的…...
wsl(2) -- ubuntu24.04配置
1. 常用脚本及别名配置 修改的文件内容参考另一篇文章常用bash脚本。 修改~/.bashrc,在文件末尾追加以下内容。 # Add by user export MYTOOLS$HOME/tools export MYBINS$HOME/bin # 系统中其他地方已经添加过了,暂不清楚是哪里添加的 #export PATH$M…...
python快速搭建https服务器
本文介绍了在ubuntu操作系统上搭建https服务器的过程 在一台连接到网络的主机上搭建https服务器,假设该主机的ip地址为:10.98.69.174 创建证书example.crt和私钥example.key openssl req -newkey rsa:2048 -nodes -keyout example.key -x509 -days 365…...
网络原理3-应用层(HTTP/HTTPS)
目录 DNSHTTP/HTTPSHTTP协议报文HTTP的方法请求报头、响应报头(header)状态码构造HTTP请求HTTPS 应用层是我们日常开发中最常用的一层,因为其他层:传输层、网络层、数据链路层、物理层这些都是操作系统和硬件、驱动已经实现好的,我们只能使用…...
JVM(HotSpot):堆空间(Heap)以及常用相关工具介绍
文章目录 一、内存结构图二、堆的定义三、堆内存溢出四、堆内存排查工具 一、内存结构图 二、堆的定义 1、通过new关键字创建的对象,都会放到堆空间中。 2、它是线程共享的,堆中的对象都要考虑线程安全问题。 那有同学肯定会问,方法内通过n…...
【Python语言初识(六)】
一、网络编程入门 1.1、TCP/IP模型 实现网络通信的基础是网络通信协议,这些协议通常是由互联网工程任务组 (IETF)制定的。所谓“协议”就是通信计算机双方必须共同遵从的一组约定,例如怎样建立连接、怎样互相识别等,…...
使用root账号ssh登录虚拟机ubuntu
在C:\Users\Administrator\.ssh目录下的config中,添加ubuntu会在根目录中,建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中,把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹,就可以不需要在ubu…...
五子棋双人对战项目(1)——WebSocket介绍
目录 一、项目介绍 如何实现实时同步对局? 二、WebSocket 1、什么是WebSocket? 2、WebSocket的报文格式 opcode payload len payload data 3、WebSocket握手过程 4、WebSocket代码的简单编写 三、WebSocket 和 HTTP的关系 1、相同点…...
rabbitMq------信道管理模块
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言信道管理的字段申明/删除交换机申明/删除队列绑定/解绑消息的发布消息确认订阅队列取消订阅信道内存管理类打开信道关闭信道/获取指定信道 总结 前言 信道是在…...
如何只用 CSS 制作网格?
来源:how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时,对其中的网格比较好奇,作者提供了 stackoverflow 的链接,就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…...
Linux安装RabbitMQ安装
1. RabbitMQ介绍 1.1 RabbitMQ关键特性 异步消息传递:允许应用程序在不直接进行网络调用的情况下交换消息。 可靠性:支持消息持久化,确保消息不会在系统故障时丢失。 灵活的路由:支持多种路由选项,包括直接、主题、…...
SpringBoot驱动的社区医院信息管理平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理社区医院信息平台的相关信息成为必然。开发…...
MyBatis-Plus如何分页查询?
MyBatis-Plus提供了一种简单而强大的分页查询功能,可以通过使用Page对象和Mapper接口中的方法来实现。以下是分页查询的基本步骤: 添加分页插件依赖 确保你的项目中已经添加了MyBatis-Plus的分页插件依赖。 <dependency><groupId>com.bao…...
云原生之容器编排实践-OpenEuler23.09离线安装Kubernetes与KubeSphere
背景 有互联网的日子确实美好,不过有时候,仅仅是有时候,你可能会面临离线部署 Kubernetes 与 KubeSphere 集群的要求。。 我们借助由青云开源的容器平台, KubeSphere 来进行可视化的服务部署。 KubeSphere 是在 Kubernetes 之上…...
构建企业数字化转型的战略基石——TOGAF框架的深度解析
数字化时代的企业变革需求 在全球范围内,数字化转型已成为企业提高竞争力、优化运营流程、提升客户体验的核心战略。数字技术的迅猛发展,不仅改变了传统行业的运作模式,也迫使企业重新思考其业务架构和技术基础设施。TOGAF(The O…...
docker -私有镜像仓库 - harbor安装
文章目录 1、镜像仓库简介2、Harbor简介3、下载与安装3.1、下载3.2、安装3.2.1、上传harbor-offline-installer-v2.8.2.tgz到虚拟机中解压并修改配置文件3.2.2、解压tgz包3.2.3、切换到解压缩后的目录下3.2.4、准备配置文件3.2.5、修改配置文件 4、启动Harbor5、启动关闭命令6、…...
头号积木玩家——软件工程专业职业生涯规划报告
说明:本报告为博主在浙江科技学院(现浙江科技大学)就读软件工程本科专业时,在必修课程《计算机导论》中撰写的报告。(报告主体2021年11月定稿,有删改) 标题说明:在电影《头号玩家》…...
Redis(初步认识和安装)
初识Redis 认识NoSQLSQL结构化:structure关联的:RelationalSQL查询ACID NoSQL非结构化无关联的非SQLBASE 认识Redis安装Redis 认识NoSQL SQL和NoSQL比较 SQL 结构化:structure 数据库中表的字段都有固定的结构 关联的:Relati…...
计算机网络:计算机网络概述:网络、互联网与因特网的区别
文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…...
网络编程套接字TCP
前集回顾 上一篇博客中我们写了一个UDP的echo server,是一个回显服务器:请求是啥,响应就是啥 一个正常的服务器,要做三个事情: 读取请求并解析根据请求,计算响应把响应写回到客户端 DatagramPacket res…...
Git
Git-2.34.1-64-bitGit-2.34.1-64-bitTortoiseGit-2.4.0.2-64bitTortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN 下载Git-2.34.1-64-bit、TortoiseGit-2.4.0.2-64bit、TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN,依次安装。 # 配置本地Git的用户名与邮箱 git c…...
【日常记录】现在遇到的Y7000P亮度无法调节问题,无需改动注册表进行调整的方法。
1、winR 2、输入:services.msc 3、找到下面红框内的服务 4、右键后,点击重启任务,重启任务后,再次按热键即可恢复亮度调节。...
ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法
1. 首先直接运行xrandr命令,查看设备的相关信息: 运行之后会显示当前连接设备的屏幕信息,如下图,LVDS和VGA-0,而HDMI屏幕为disconnect,意为没有连接: 2. 设置开机主屏幕显示: xrand…...
师生健康信息管理:SpringBoot技术指南
第3章 系统分析 3.1 需求分析 师生健康信息管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性,…...
手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南
Wallpaper 动态壁纸文件获取及使用指南 目录 壁纸文件获取手机 / 平板使用手机 / 平板效果预览注意事项PC/Mac 使用 1. 壁纸文件获取链接 链接:夸克网盘分享 复制链接到浏览器打开并转存下载即可。 (主页往期视频的 4K 原图和 mpkg 动态壁纸文件…...
海外网站服务器网址/中国500强最新排名
异或运算法则 1. a ^ b b ^ a 2. a ^ b ^ c a ^ (b ^ c) (a ^ b) ^ c; 3. d a ^ b ^ c 可以推出 a d ^ b ^ c. 4. a ^ b ^ a b. 异或运算 1、异或是一个数学运算符。应用于逻辑运算。 2、例如:真异或假的结果是真,假异或真的结果也是真&#x…...
为什么用MyEclipse做网站/清远疫情防控措施
记事本原本是电脑上的一个记事小工具,后来成了记事工具的代表。其实,手机上的记事工具是种类非常多,除了记事本外,便签、备忘录也是非常常用的记事工具。这些记事工具虽然名字不同,但是功能大同小异。 虽然应用商城里…...
unas做网站服务器/广州信息流推广公司排名
Flink 相关的组件和作业的稳定性通常是比较关键的,所以得需要对它们进行监控,如果有异常,则需要及时告警通知。本章先会教会教会大家如何利用现有 Flink UI 上面的信息去发现和排查问题,会指明一些比较重要和我们非常关心的指标&a…...
会所类WordPress主题/杭州seo营销
我们通过题目就可以猜测出这道题与Cookie相关 我们发现我们的钱并不能购买到Flag Cookie,尝试使用Burp Suite抓包 对cookie解码发现是一堆乱码,但seesion中包含着我们想要的信息 将49改为9999,再经过Base64编码通过修改Cookie的值让我们瞬间…...
网页版梦幻西游官网/武汉网站seo德升
功能单元的最大扇入扇出工具分析文档名称:功能单元最大扇入扇出工具分析作 者:日 期:1. 概念由于度量的目标是C源代码,所以“功能单元的最大扇入扇出”的含义如下:功能单元:c语言的函数。扇入:有多少其他函…...
1号网站建设 高端网站建设/四川网站seo
题目链接:http://poj.org/problem?id2955 题意:求相互匹配的括号个数。 一道简单的区间dp,按常规的套路来写就可以了。 #include <iostream> #include <cstring> #include <string> using namespace std; int dp[110][110…...