首页 > 其他分享 >网安研发之初识抽象语法树

网安研发之初识抽象语法树

时间:2023-06-19 16:37:39浏览次数:48  
标签:词法 AST 代码 规则 语法 初识 SQL 网安

原文合集地址如下,有需要的朋友可以关注

本文地址

合集地址

认识抽象语法树

什么是抽象语法树

抽象语法树(Abstract Syntax Tree,简称AST)是计算机科学中一种用于表示程序源代码结构的树状数据结构。它是源代码经过词法分析和语法分析之后生成的一种中间表示形式。

AST以树的形式表示程序的语法结构,其中每个节点代表源代码中的一个语法元素,如表达式、语句、函数等。节点之间通过父子关系和兄弟关系建立连接,形成一棵层次结构的树。

AST的节点类型通常与编程语言的语法规则相关,每个节点存储了相应语法结构的信息,如标识符、操作符、常量等。通过遍历和分析AST,可以进行语法检查、代码优化、代码生成等编译器和解释器相关的任务。

与源代码相比,AST剥离了冗余信息,并提供了一种更加抽象和结构化的表示方式,便于程序分析和处理。它被广泛应用于编程语言工具、编译器、静态分析器、代码编辑器等领域,用于实现诸如自动补全、代码重构、代码规范检查等功能。

抽象语法树是在什么时候生成的

抽象语法树(Abstract Syntax Tree,AST)通常在编译器或解释器的前端阶段生成。生成AST的过程可以分为两个主要步骤:词法分析和语法分析。

词法分析(Lexical Analysis)

在词法分析阶段,源代码被分割成一个个的词法单元(Tokens)。词法单元是语法上有意义的最小单元,例如关键字、标识符、操作符等。词法分析器扫描源代码,将其转化为一系列的词法单元,并将它们传递给下一个阶段。

语法分析(Syntactic Analysis)

在语法分析阶段,词法分析器生成的词法单元被用于构建抽象语法树。语法分析器按照编程语言的语法规则,对词法单元进行分析和组织,构建出一棵树状结构,即抽象语法树。语法分析器使用一种称为语法规则的定义来确定如何将词法单元组合成语法结构。

生成AST的过程通常使用工具和技术,如词法分析器生成器(例如Lex、Flex)和语法分析器生成器(例如Yacc、Bison)来自动生成相应的词法分析器和语法分析器。这些工具根据语言的词法和语法规则,自动生成用于构建AST的代码。

总之,AST在编译器或解释器的前端阶段生成,为后续的编译或解释过程提供了一种中间表示形式,方便进行语义分析、代码优化和代码生成等操作。

抽象语法树常见的格式

利用抽象语法树实现的工具

分析源代码

有许多工具和开源代码库可以利用抽象语法树(AST)来分析源代码。以下是一些常用的工具和库:

Esprima

用于JavaScript的解析器,可以将JavaScript代码解析成AST,并提供API用于遍历和分析AST。

Roslyn

微软开发的.NET编译器平台,支持多种.NET语言(如C#和Visual Basic)的AST分析。

PyAST

Python官方提供的用于处理Python代码的AST模块,可以将Python代码解析成AST,并提供API用于分析和转换AST。

clang

C/C++编译器前端,使用Clang可以生成C/C++代码的AST,并提供API用于分析和操作AST。

Eclipse JDT

用于Java开发的Eclipse Java Development Tools,提供了Java代码的AST构建和分析功能。

IntelliJ IDEA

针对多种编程语言的集成开发环境,如Java、Kotlin、Python等,提供了AST分析的功能。

Tree-sitter

通用的语法解析器生成器,支持多种编程语言,可生成对应语言的AST,提供了API用于AST分析。

Python's ast模块

Python的内置模块ast提供了对Python代码的解析和AST分析功能,可用于分析Python代码结构。

这只是一小部分工具和库,用于分析源代码的AST。不同语言和领域可能会有特定的工具和库可用,具体选择取决于你要分析的编程语言和目标。

静态分析器或者代码规范检查

ESLint

针对JavaScript和TypeScript的静态代码分析工具,基于AST进行代码规范检查、错误检测和代码质量分析。

Pylint

用于Python的静态代码分析工具,通过解析Python代码的AST进行代码规范检查、错误检测和代码质量分析。

RuboCop

针对Ruby的静态代码分析工具,利用Ruby的AST进行代码规范检查、错误检测和代码质量分析。

SonarQube

一个用于多种编程语言的静态代码分析平台,基于AST进行代码规范检查、错误检测、安全漏洞检测等静态分析功能。

Checkstyle

用于Java的静态代码分析工具,通过解析Java代码的AST进行代码规范检查和代码质量分析。

Stylelint

针对CSS和CSS预处理器的静态代码分析工具,基于AST进行CSS代码规范检查和代码质量分析。

Flawfinder

用于C和C++的静态代码分析工具,基于AST进行漏洞检测和代码质量分析。

Bandit

用于Python的安全性扫描工具,基于AST进行检测潜在的安全漏洞。

利用抽象语法树进行执行SQL的动态异常检测

实现的功能

实现一个基于规则引擎的系统,利用 SQL 的抽象语法树(AST)来检测 SQL 中是否存在 SQL 注入等异常操作,以下是一些基本功能:

AST 解析和构建

实现 SQL 解析器,将输入的 SQL 语句解析为 AST,并构建具有层次结构的抽象语法树表示。

规则定义和管理

设计和实现规则引擎,允许定义和管理检测 SQL 异常操作的规则。规则应该包括 SQL 注入检测以及其他异常操作的检测规则。

规则评估和执行

在 AST 的遍历过程中,根据定义的规则评估节点和语法元素,确定是否存在异常操作。规则引擎应提供相应的执行逻辑,可根据规则定义进行判断并生成结果。

异常操作报告

如果检测到异常操作,系统应生成详细的报告,包括异常操作的类型、位置、相关上下文等信息。报告可以采用适当的格式(如文本、JSON 等)进行输出和展示。

规则管理界面

提供一个用户界面或命令行界面,用于管理和配置规则。这样,系统管理员或开发人员可以添加、修改和删除规则,以满足特定需求。

可扩展性和灵活性

系统应具备良好的可扩展性和灵活性,使其能够适应不同的 SQL 方言、规则和业务场景。它应该支持易于添加和定制规则的机制,并允许扩展和修改解析器以适应新的需求。

安全性和性能优化

确保系统具备安全性,包括对规则和配置的访问控制、输入验证和防御性编程。此外,对于大规模的 SQL 查询,系统应考虑性能优化,以保持良好的响应时间和可扩展性。

日志和审计功能

记录系统的活动和执行结果,包括输入 SQL 查询、规则匹配结果和异常操作报告等。这有助于问题排查、审计追踪和系统监控。

理论步骤

利用 SQL 的抽象语法树(AST)来判断一个 SQL 是否是异常操作可以采取以下步骤:

解析 SQL

将待分析的 SQL 语句解析为 AST。可以使用开源的 SQL 解析器库(如 jSqlParser)来完成此步骤。解析后的 AST 将表示 SQL 语句的结构和语义。

遍历 AST

对生成的 AST 进行遍历,访问各个节点和语法元素。这可以通过编写代码来实现,根据所使用的解析器库提供的 API 进行遍历操作。

定义异常操作规则

根据具体的需求,定义用于判断异常操作的规则。这些规则可以包括但不限于以下方面:

  • 限制查询的结果集大小:检查查询中是否存在 LIMIT 子句,并验证其限制结果集大小的值是否合理。
  • 禁止使用危险操作:检查是否使用了危险的 SQL 操作,如 DELETE、TRUNCATE TABLE 等。
  • 防止 SQL 注入:检查 SQL 语句中是否存在潜在的 SQL 注入漏洞,如动态构建 SQL 字符串时是否使用了参数绑定或预编译语句。

应用规则并进行判断

根据定义的异常操作规则,在 AST 的遍历过程中应用这些规则,并进行相应的判断。例如,对于每个查询语句节点,检查是否符合限制结果集大小的规则;对于每个操作语句节点,检查是否存在禁止的危险操作。

报告异常操作

如果在 AST 的遍历过程中检测到异常操作,可以生成相应的警告或错误报告。报告可以包含详细的信息,例如异常操作的类型、位置和相关上下文等。

标签:词法,AST,代码,规则,语法,初识,SQL,网安
From: https://blog.51cto.com/u_14196886/6515561

相关文章

  • 网安研发之初识抽象语法树
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址认识抽象语法树什么是抽象语法树抽象语法树(AbstractSyntaxTree,简称AST)是计算机科学中一种用于表示程序源代码结构的树状数据结构。它是源代码经过词法分析和语法分析之后生成的一种中间表示形式。AST以树的形式表示......
  • Java学习_第一个语法:添加注释
    单行注释://注释内容多行注释:/* 注释内容*/idea软件小技巧:多行注释往往容易找不到重点,可以在要做的事之前加上TODO前缀,idea软件会帮你高亮标注出来。 ......
  • 《英语语法 —— 冠词》
    1.冠词不定冠词(a和an):冠词a(n)交代它后面所接的名词时“一个”的概念。如果后面的名词不合适以“一个”来交代,就不用加a(n)。anewbook其中a作为限定词,代表book只有一本,加上new这个形容词来形容book。这样就组成了一个名词短语。Unmarriedmenareararespecies......
  • 正则表达式的语法规则
    元字符元字符 描述.   查找单个字符,除了换行和行结束符\w  查找单词字符\W  查找非单词字符\d  查找数字\D  查找非数字字符\s  查找空白字符\S  查找非空白字符\b  匹配单词边界\B  匹配非单词边界\0  查找NUL字符\n  查找换行符\f  查找......
  • 考试突击3语法分析上到下
    自上而下终结符和非终结符单词符号,称为终结符,(不可再分语法单位称为非终结符,(可再分,能出现再上下无关文法左边产生式:<>-><><>开始符号只能是非终结符直接推导=>表示只需要一步的直接推导,推导a=>b=>c,a到c是一个推导,要很多步句型,句子,语言文法G所产生句子的全体称为......
  • 基础语法2运算符
    基础语法2运算符Java运算符可以分为以下几种类型:算术运算符:用于执行数学运算,如+、*、/、%(取余)等。关系运算符:用于比较两个值的大小或相等性,如==、!=、>、<、>=、<=等。逻辑运算符:用于判断两个或多个条件的真假,如&&、||、!等。位运算符:用于对整数类型的二进制位进行操作,如&......
  • Python学习日志一,初识Python
    一、向python说你好世界(print("Helloworld!!"))二、pycharm插件推荐使用上图这个插件就可以翻译代码里面的英文单词了三、Pycharm常用快捷键ctrl+alt+s:打开软件设置shift+alt+上/下:将当前行代码上移或者下移Ctrl+shift+f10:运行当前代码f6:重命名文件四......
  • socket网络编程(一)——初识socket
    出现一项技术,首先我们弄懂一下,为什么要出现。那么为什么要出现socket这玩意呢?可以很简单的用一句话来概括:为了实现两台计算机的通信1、socket诞生的原因两台装有操作系统的机子要想实现通信,第一要联网,第二通信双方一定制定某种规则。我们平时最为常见的http请求也是一种通信协......
  • 初识SQL语句
    1、create使用CREATEDATABASEtest//j建库ON{name=test_data,FIlENAME='D:test_data.mdf',SIZE=3,MAXSIZE=5,FILEGROWTH=1}LOGon{name=test_log,FILENAME='D:\test_data_log',SIZE=1MB,MAXSIZE=2MB,FILEGROWTH=1}go......
  • 【MathJax】语法总结
    基础语法1.显示公式在行中显示的(inlinemode),就用$...$单独一行显示(displaymode),则用$$...$$2.希腊字母要显示希腊字母,可以用\alpha,\beta,…,\omega,输出\(\alpha,\beta,…,\omega\)想要显示大写的话,就用\Gamma,\Delta,…,\Omega,输出\(\Gamma,\Delta,......