偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

實(shí)戰(zhàn)用Python解析出抽象語法樹

開發(fā) 前端
sqlparse 可以解析和分析 SQL 語句,并將其拆分為不同的標(biāo)記(token)。這使得您可以訪問和操作 SQL 語句的各個(gè)部分,如 SELECT 語句中的列、表名、WHERE 子句等。

生成抽象語法樹的例子

SQL

利用python的sqlparse庫

sqlparse 是一個(gè)用于解析和分析 SQL 語句的 Python 庫。它提供了一系列功能,可用于解析和操作 SQL 語句的不同組成部分,如關(guān)鍵字、標(biāo)識(shí)符、表達(dá)式、函數(shù)、注釋等。

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

解析 SQL 語句

sqlparse 可以解析和分析 SQL 語句,并將其拆分為不同的標(biāo)記(token)。這使得您可以訪問和操作 SQL 語句的各個(gè)部分,如 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 對(duì)象
    print_tokens(parsed.tokens)


if __name__ == '__main__':
    demo1()

運(yùn)行的結(jié)果為:

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 )

可以發(fā)現(xiàn),sqlparse將SQL拆分成了一個(gè)一個(gè)token,在語法和詞法解析領(lǐng)域,Token(記號(hào))是指源代碼中的最小語義單元,它代表了編程語言中的一個(gè)詞法元素。Token 是語法分析器(Parser)在解析源代碼時(shí)所使用的基本單位。

在編程語言中,Token 可以表示關(guān)鍵字、標(biāo)識(shí)符、操作符、常量、字符串、注釋等各種語法成分。語法分析器通過詞法分析(Lexical Analysis)將源代碼分解為一系列的 Token,以便進(jìn)行進(jìn)一步的語法分析和語義處理。

詞法分析器(也稱為詞法解析器或掃描器)負(fù)責(zé)將源代碼字符串轉(zhuǎn)換為一系列 Token。它通過掃描源代碼字符流,識(shí)別出連續(xù)的字符組成的詞法單元,并為每個(gè)詞法單元分配一個(gè)相應(yīng)的 Token 類型。每個(gè) Token 類型通常具有一個(gè)唯一的標(biāo)識(shí)符和相關(guān)的屬性值。

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

x = 10 + y

詞法分析器將識(shí)別出以下 Token:

  • 標(biāo)識(shí)符 Token:x
  • 操作符 Token:=
  • 數(shù)字常量 Token:10
  • 操作符 Token:+
  • 標(biāo)識(shí)符 Token:y

詞法分析器將將這些 Token 傳遞給語法分析器,后者負(fù)責(zé)根據(jù)語法規(guī)則進(jìn)行進(jìn)一步的解析和分析。

通過使用 Token,語法分析器可以更容易地理解和處理源代碼的結(jié)構(gòu)。每個(gè) Token 都包含了與之相關(guān)的類型信息和屬性值,使得語法分析器能夠根據(jù) Token 類型進(jìn)行相應(yīng)的語法規(guī)則匹配和語義處理。

在拿到這棵詞法解析樹之后,不管sql注入如何變幻,我們都可以定位到最小token單元,從而動(dòng)態(tài)監(jiān)測sql注入的行為。

格式化 SQL 語句

sqlparse 可以根據(jù)預(yù)定義的樣式規(guī)則對(duì) SQL 語句進(jìn)行格式化。這使得 SQL 語句的結(jié)構(gòu)更加清晰可讀,便于理解和調(diào)試。

當(dāng)使用 sqlparse 庫來格式化 SQL 語句時(shí),它會(huì)執(zhí)行以下操作:

  1. 重新縮進(jìn):sqlparse 會(huì)根據(jù)語句的嵌套結(jié)構(gòu)重新縮進(jìn)語句,使其更具可讀性和結(jié)構(gòu)清晰。它會(huì)根據(jù)語句中的關(guān)鍵字、括號(hào)、逗號(hào)等進(jìn)行縮進(jìn)操作,以反映語句的層次結(jié)構(gòu)。
  2. 關(guān)鍵字大小寫轉(zhuǎn)換:sqlparse 可以根據(jù)指定的選項(xiàng)將關(guān)鍵字轉(zhuǎn)換為特定的大小寫形式。您可以選擇將關(guān)鍵字轉(zhuǎn)換為大寫、小寫或首字母大寫。這可以使 SQL 語句中的關(guān)鍵字在格式化后保持一致性。
  3. 空格和換行符處理:sqlparse 會(huì)添加適當(dāng)?shù)目崭窈蛽Q行符,以提高語句的可讀性。它會(huì)在逗號(hào)、括號(hào)、運(yùn)算符等符號(hào)周圍添加空格,使語句更易于理解。此外,它會(huì)根據(jù)語句的結(jié)構(gòu)添加適當(dāng)?shù)膿Q行符,以使語句在屏幕上更好地展示。
  4. 注釋處理:sqlparse 會(huì)解析 SQL 語句中的注釋,并根據(jù)注釋的位置將其正確地應(yīng)用于格式化的結(jié)果。這有助于確保注釋在格式化后保持正確的位置和格式。
  5. 字符串處理:sqlparse 會(huì)解析和處理 SQL 語句中的字符串,以確保在格式化后字符串的內(nèi)容保持不變。它會(huì)保留字符串中的引號(hào)和轉(zhuǎn)義字符,以保持字符串的完整性。

下面是一個(gè)例子:

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,最終的結(jié)果為:

SELECT *
FROM users
WHERE deleted_mark = FALSE

分析 SQL 語句結(jié)構(gòu)

sqlparse 可以分析 SQL 語句的結(jié)構(gòu),并提供了一組 API 用于查找和操作特定類型的 SQL 元素。例如,您可以使用 sqlparse 查找和訪問所有的表名、列名、函數(shù)調(diào)用等。

過濾 SQL 片段

sqlparse 可以根據(jù)指定的條件過濾和選擇 SQL 語句中的特定部分。例如,您可以使用 sqlparse 僅提取 SELECT 語句中的列名,或者僅提取 WHERE 子句中的條件表達(dá)式。

解析 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)


            # 獲取參數(shù)名和默認(rèn)值
            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)

運(yùn)行的結(jié)果為

Function definition: greet
Parameter name: name
Return value: 1

責(zé)任編輯:武曉燕 來源: 海燕技術(shù)棧
相關(guān)推薦

2025-06-17 04:00:00

2022-07-18 14:18:26

Babel代碼面試

2017-11-23 15:24:35

Python速覽實(shí)戰(zhàn)

2015-12-07 14:11:01

2018-06-27 11:36:43

陳國興

2017-07-24 09:45:15

JavaScript語法代碼

2024-07-17 14:16:40

XMLPythonWeb開發(fā)

2009-12-18 15:56:05

Ruby特殊語法

2024-01-24 08:53:55

Figma設(shè)計(jì)文件fig 文件

2017-07-26 17:38:10

JavaScriptBabel

2024-04-24 08:43:06

Figmafig 文件圖形編輯器

2021-05-09 18:04:05

Python母親祝福

2021-04-13 14:07:22

JUC解析AQS抽象

2010-07-20 14:41:55

Perl語法

2010-09-17 14:49:04

Java數(shù)據(jù)類型

2010-05-19 13:55:37

2010-09-14 16:04:40

CSSclip屬性

2011-05-31 16:55:43

2017-12-12 12:24:39

Python決策樹

2024-01-15 07:47:09

井字棋游戲編程練習(xí)Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)