实战用Python解析出抽象语法树

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 抽象语法树分析可以动态的做网络安全的解析,例如,对SQL语句的解析,可以有效检测SQL是否存在问题

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

本文地址

合集地址

生成抽象语法树的例子

SQL

利用python的sqlparse库

sqlparse 是一个用于解析和分析 SQL 语句的 Python 库。它提供了一系列功能,可用于解析和操作 SQL 语句的不同组成部分,如关键字、标识符、表达式、函数、注释等。

以下是 sqlparse 库的一些主要功能:

解析 SQL 语句

sqlparse 可以解析和分析 SQL 语句,并将其拆分为不同的标记(token)。这使得您可以访问和操作 SQL 语句的各个部分,如 SELECT 语句中的列、表名、WHERE 子句等。

以sql代码SELECT * FROM users WHERE id = '1' OR '1'='1' or (1=2) or (x = '(123)')为例,编写了如下示例:

import sqlparse

# 递归打印 SQL 解析树
def print_tokens(tokens, indent=0):
    for token in tokens:
        if hasattr(token, "tokens"):
            print_tokens(token.tokens, indent + 4)
        else:
            print(" " * indent,token.ttype, token.value)

# 解析 SQL 查询语句
def demo1():
    user_input = "1' OR '1'='1"
    sql_query = "SELECT * FROM users WHERE id = '" + user_input + "' or (1=2) or (x = '(123)')"
    print(sql_query)
    parsed = sqlparse.parse(sql_query)[0]
    # 打印 AST 对象
    print_tokens(parsed.tokens)

if __name__ == '__main__':
    demo1()

运行的结果为:

Token.Keyword.DML SELECT
 Token.Text.Whitespace  
 Token.Wildcard *
 Token.Text.Whitespace  
 Token.Keyword FROM
 Token.Text.Whitespace  
     Token.Name users
 Token.Text.Whitespace  
     Token.Keyword WHERE
     Token.Text.Whitespace  
             Token.Name id
         Token.Text.Whitespace  
         Token.Operator.Comparison =
         Token.Text.Whitespace  
         Token.Literal.String.Single '1'
     Token.Text.Whitespace  
     Token.Keyword OR
     Token.Text.Whitespace  
         Token.Literal.String.Single '1'
         Token.Operator.Comparison =
         Token.Literal.String.Single '1'
     Token.Text.Whitespace  
     Token.Keyword or
     Token.Text.Whitespace  
         Token.Punctuation (
             Token.Literal.Number.Integer 1
             Token.Operator.Comparison =
             Token.Literal.Number.Integer 2
         Token.Punctuation )
     Token.Text.Whitespace  
     Token.Keyword or
     Token.Text.Whitespace  
         Token.Punctuation (
                 Token.Name x
             Token.Text.Whitespace  
             Token.Operator.Comparison =
             Token.Text.Whitespace  
             Token.Literal.String.Single '(123)'
         Token.Punctuation )

可以发现,sqlparse将SQL拆分成了一个一个token,在语法和词法解析领域,Token(记号)是指源代码中的最小语义单元,它代表了编程语言中的一个词法元素。Token 是语法分析器(Parser)在解析源代码时所使用的基本单位。

在编程语言中,Token 可以表示关键字、标识符、操作符、常量、字符串、注释等各种语法成分。语法分析器通过词法分析(Lexical Analysis)将源代码分解为一系列的 Token,以便进行进一步的语法分析和语义处理。

词法分析器(也称为词法解析器或扫描器)负责将源代码字符串转换为一系列 Token。它通过扫描源代码字符流,识别出连续的字符组成的词法单元,并为每个词法单元分配一个相应的 Token 类型。每个 Token 类型通常具有一个唯一的标识符和相关的属性值。

例如,在下面的代码片段中:

x = 10 + y

词法分析器将识别出以下 Token:

  • 标识符 Token:x
  • 操作符 Token:=
  • 数字常量 Token:10
  • 操作符 Token:+
  • 标识符 Token:y

词法分析器将将这些 Token 传递给语法分析器,后者负责根据语法规则进行进一步的解析和分析。

通过使用 Token,语法分析器可以更容易地理解和处理源代码的结构。每个 Token 都包含了与之相关的类型信息和属性值,使得语法分析器能够根据 Token 类型进行相应的语法规则匹配和语义处理。

在拿到这棵词法解析树之后,不管sql注入如何变幻,我们都可以定位到最小token单元,从而动态监测sql注入的行为。

格式化 SQL 语句

sqlparse 可以根据预定义的样式规则对 SQL 语句进行格式化。这使得 SQL 语句的结构更加清晰可读,便于理解和调试。

当使用 sqlparse 库来格式化 SQL 语句时,它会执行以下操作:

  1. 重新缩进:sqlparse 会根据语句的嵌套结构重新缩进语句,使其更具可读性和结构清晰。它会根据语句中的关键字、括号、逗号等进行缩进操作,以反映语句的层次结构。
  2. 关键字大小写转换:sqlparse 可以根据指定的选项将关键字转换为特定的大小写形式。您可以选择将关键字转换为大写、小写或首字母大写。这可以使 SQL 语句中的关键字在格式化后保持一致性。
  3. 空格和换行符处理:sqlparse 会添加适当的空格和换行符,以提高语句的可读性。它会在逗号、括号、运算符等符号周围添加空格,使语句更易于理解。此外,它会根据语句的结构添加适当的换行符,以使语句在屏幕上更好地展示。
  4. 注释处理:sqlparse 会解析 SQL 语句中的注释,并根据注释的位置将其正确地应用于格式化的结果。这有助于确保注释在格式化后保持正确的位置和格式。
  5. 字符串处理:sqlparse 会解析和处理 SQL 语句中的字符串,以确保在格式化后字符串的内容保持不变。它会保留字符串中的引号和转义字符,以保持字符串的完整性。

下面是一个例子:

def demo2():
    sql_statement = 'select * from users where deleted_mark = false '
    formatted_sql = sqlparse.format(sql_statement, reindent=True, keyword_case='upper')
    print(formatted_sql)

上述代码中,我们的sql语句为select * from users where deleted_mark = false,最终的结果为:

SELECT *
FROM users
WHERE deleted_mark = FALSE

分析 SQL 语句结构

sqlparse 可以分析 SQL 语句的结构,并提供了一组 API 用于查找和操作特定类型的 SQL 元素。例如,您可以使用 sqlparse 查找和访问所有的表名、列名、函数调用等。

过滤 SQL 片段

sqlparse 可以根据指定的条件过滤和选择 SQL 语句中的特定部分。例如,您可以使用 sqlparse 仅提取 SELECT 语句中的列名,或者仅提取 WHERE 子句中的条件表达式。

解析 SQL 片段

sqlparse 不仅可以解析完整的 SQL 语句,还可以解析和分析 SQL 片段。这使得您可以处理和操作 SQL 片段而不仅仅是完整的语句。

python

ast库解析python代码

def demo3():
    import ast

    code = """
def greet(name=123):
    print(f"Hello, {name}!")
    return 1
    """

    tree = ast.parse(code)

    class MyVisitor(ast.NodeVisitor):
        def visit_FunctionDef(self, node):
            print("Function definition:", node.name)

            # 获取参数名和默认值
            for arg in node.args.args:
                print("Parameter name:", arg.arg)

            # 获取返回值
            for statement in node.body:
                if isinstance(statement, ast.Return):
                    print("Return value:", ast.literal_eval(statement.value))

            self.generic_visit(node)

    visitor = MyVisitor()
    visitor.visit(tree)

运行的结果为

Function definition: greet
Parameter name: name
Return value: 1
目录
相关文章
|
26天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
28天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
58 4
|
27天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
28 1
|
28天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
42 1
|
29天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
36 2
|
1月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
43 1
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
47 1
|
24天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
35 0
|
27天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
1月前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####

推荐镜像

更多