CodeQL笔记之基本语法(一)
文章目录
- 前言
- CodeQL基本语法
- 1.语法结构
- 2.类库
- 3.谓词
- 4.基本数据类型及其内建函数
前言
学习利用CodeQL进行Java代码审计。包含一些概念和例子。
CodeQL基本语法
CodeQL是利用解析引擎把我们需要审计的项目解析成了数据库,注意此处的数据库是转换成CodeQL能识别的中间层数据库。因为核心的解析引擎是不开源的,所以生成一个中间数据库。然后我们可以编写相关的QL规则,然后CodeQL引擎会根据规则去数据库中找到满足条件的数据,我们再分析即可。
1.语法结构
1)QL查询的语法结构为:
from [datatype] var /* ... 变量声明... */
where condition(var = something) /* ... 逻辑公式 ... */
select var /* ... 表达式 ... */
2)一个小例子作用就是在所有的整形数字i中,当i==1的时候,输出 i。
// 表示我们要引入CodeQL的类库,因为我们分析的项目是java的,所以在ql语句里,必不可少
import java// 表示我们定义一个变量i,它的类型是int,表示我们获取所有的int类型的数据
from int i
// 表示当i等于1的时候,符合条件
where i = 1
// 表示输出i
select i
3)也可以利用官方搭建的平台练习写一些规则。LGTM查询控制台:https://lgtm.com/query
2.类库
1)CodeQL解析引擎会把我们需要审计的项目代码转换为CodeQL可识别的AST数据库,格式如下所示。可以看出来大体是两级一个是导入的包,一个是类的。类的下面是一些方法、属性等。类库实际上就是上面AST的对应关系。
2)比如说想要获取所有类当中的方法,在AST中 Method 就表示获取当前项目中所有的方法。如下所示:
import javafrom Method method
select method
3)升级一下,通过Method类内置的一些方法,把结果过滤一下。比如获取名字为get的方法名称。
import javafrom Method method
where method.hasName("get")
/**
method.getName() 获取的是当前方法的名称
method.getDeclaringType() 获取的是当前方法所属class的名称。
**/
select method.getName(), method.getDeclaringType()
3.谓词
1)谓词是用于描述构成 QL 程序的逻辑关系。概念上和函数有点像。个人根据官方文档理解,谓词就是一个一元数组或二元数组,一元数组的集合谓词元数就是一,二元数组的集合谓词元数就是二。通常,谓词中的所有元组都具有相同数量的元素。谓词的数量是元素的数量,不包括可能的result变量。QL中有许多内置谓词,可以参考官方文档:https://codeql.github.com/docs/ql-language-reference/ql-language-specification/#built-ins。
2)定义一个谓词条件:
- 需要关键字 predicate
- 需要一个小写字母开头的标识符,例如:isCountry
- 定义参数,多个用逗号连接,每个参数,需要指定参数类型和参数变量的标识符。
- 谓词本身一个大的花括号 “{ }”
3)官方例子:
predicate isCountry(string country) {country = "Germany"orcountry = "Belgium"orcountry = "France"
}predicate hasCapital(string country, string capital) {country = "Belgium" and capital = "Brussels"orcountry = "Germany" and capital = "Berlin"orcountry = "France" and capital = "Paris"
}
4)上方查询get的例子还可以按照如下所示改写。
import javapredicate isGet(Method method) {exists(|method.hasName("get"))
}from Method method
where isGet(method)
select method.getName(), method.getDeclaringType()
语法解释:
predicate 表示当前方法没有返回值。
exists子查询,是CodeQL谓词语法里非常常见的语法结构,它根据内部的子查询返回true or false,
来决定筛选出哪些数据。
5)谓词可分为带有结果的谓词和不带有结果的谓词。区别就是是否引入了特殊变量result,有result的话就可以顶替predicate了。参考官方案例:
// 无结果的谓词
predicate isSmall(int i) {i in [1 .. 9]
}
// 如果i是正整数并且小于10,则isSmall(i)成立。// 有结果的谓词
int getSuccessor(int i) {result = i + 1 andi in [1 .. 9]
}// 如果i是正整数并且小于10,则这个谓词的结果就是接替i
4.基本数据类型及其内建函数
1)QL语言中的基本数据类型,包括整型、浮点型、日期型、布尔型以及字符串类型。需要注意的是,对于QL语言来说,其支持的数据类型都带有相应的内建函数——通俗来说,就是系统已经为我们写好的函数就是谓词,我们直接拿来就能用了。
2)举例来说,如果我们想求一个整数的绝对值,直接调用内建函数abs()即可,例如1.abs()。
2)就是如果我们要调用某种类型的变量的通用形式为:直接在变量后面加上一个点号,然后加上要调用的内建函数即可。同时,我们还可以通过点号将多个函数串联起来,也就是对变量连续进行多种处理,例如,对于一个整型变量s,先求绝对值,再开平方,我们可以将这个处理过程表示为:s.abs().sqrt()。
3)字符串类型,和其他语言差不多。
from string s
where s = "he\"llo"
select s
4)整型与浮点型。
from float a, int b
where a = 5.3 and b = 2
// pow的作用就是参数的几次幂 下方例子就是5.3的2次幂
select a.pow(b)
5)日期型。编写一个查询,来计算首个武汉疫情到现在已经过去了多少天了。
from date start, date now
// toDate()作用就是将指定的字符串转换为日期值
where start = "1/12/2019".toDate() and now = "25/10/2022".toDate()
select start.daysTo(now)
CodeQL笔记之基本语法(一)相关推荐
- python基本语法语句-python学习笔记:基本语法
原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...
- python3语法都相同吗_python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样...
python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入 ...
- java基本语法心得_Java学习笔记(一)——基础语法(上)
Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...
- Programming Languages PartA Week2学习笔记——SML基本语法
Programming Languages PartA Week2学习笔记--SML基本语法 首先简单介绍使用的SML语言,参考维基百科和百度百科: ML(Meta Language:元语言)是由爱丁 ...
- 《PHP学习笔记——PHP基本语法》
<PHP学习笔记--PHP基本语法> 前言: PHP是一门服务端脚本语言,像JavaScript一样,也是一门弱类型语言.弱类型语言最大的特点是允许变量隐式转换.这样,相对于Java这种强 ...
- JNI开发笔记(五)--JNI语法总结
JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...
- 鸟哥的私房菜Linux 学习笔记之 Bash语法
学习笔记备忘 case的语法 PATH=${PATH}:~/binexport PATHread -p "please input:" wordcase $word in &quo ...
- ANTLR笔记2 - 简单语法说明
ANTLR的语法文件使用扩展巴科斯范式EBNF描述,记得编译原理的用起来非常简单,需要进一步了解的是怎么构造自己的recognizer和translator.很多的语法不需要从头写,一方面很多语言标准 ...
- 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译
本次笔记内容: 5-7 在递归预测过程中进行翻译 5-8 L属性定义的自底向上翻译 本节课幻灯片,见于我的 GitHub 仓库:第10讲 语法制导翻译_3 文章目录 在递归的预测分析过程中进行翻译 算 ...
最新文章
- java 实例对象拷贝,实例详解java对象拷贝
- 【实战练习】通过docker部署jenkins
- 【SpringBoot 2】(五)自动配置简析源码 开发中小技巧
- Linux 系统创建.sh文件以及赋权、执行
- 数据分析20大基本分析方法技术总结【分析目的、分析案例、分析方法与思路】
- SpringBoot2.0应用(五):SpringBoot2.0整合MyBatis
- Python编写API接口
- 日本著名数学游戏专家中村义作教授提出这样一个问题:将2520个桔子分给六个儿子
- Python飞机大战项目终篇(一步一步实现---最全笔记)
- 黑马python5.0课件_2020整理的黑马python 5.0新课程体系零基础到就业大实战
- 关于原型设计的工具——AXURE
- 在项目中如何做图片优化
- 切片器可以设置日期格式?_如何分秒必争浅淡时间切片器
- android界面侧滑,Android 开发之Android Material Design NavigationView侧滑界面自定义
- Acer传奇Go电脑开机自动安装软件卡死怎么重装系统?
- Ping过程的完全解析
- 临近2022年末: Android 开发者的出路在哪?转行还是进阶?
- 数据库实验报告【学会使用企业管理器和查询分析器管理工具】
- c函数 postgres_C-语言函数
- ant-design vue input通过那个事件可以获得输入框变化的值_VUE使用百度地图教程