iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Security

【Google資安證書課程重點整理】系列 第 27

【Google資安證書重點整理】Day 27_Python常用的指令二

  • 分享至 

  • xImage
  •  

導讀

https://ithelp.ithome.com.tw/upload/images/20240928/20026585ZkPHGmkhiY.png
此章節解說部分常用的語法。

使用字串進行資訊安全分析

1. 安全設定中的字串數據

  • 字串 是 Python 中最常見的資料類型之一,通常用於儲存不需要數學運算的資訊。
    • 範例:IP 位址、使用者名稱、URL、員工 ID 等。
  • 在網路安全中,可能需要從這些字串中提取某些部分,或驗證字串是否符合特定條件。

2. 使用字串中的索引

  • 索引 是用來標記字串中每個字元位置的數字,從 0 開始。
    • 範例:字串 "h32rb17" 的每個字元和其對應的索引如下:
      字元:  h  3  2  r  b  1  7
      索引:  0  1  2  3  4  5  6
      
  • 負索引 可以從字串結尾開始計數:
    字元:  h  3  2  r  b  1  7
    索引:  -7 -6 -5 -4 -3 -2 -1
    

使用括號表示法來提取字串

  • 括號表示法 是使用索引來提取字串中的某個字元或切片的一部分。
    • 範例:
      device_id = "h32rb17"
      print(device_id[0])  # 輸出 h
      print(device_id[0:3])  # 輸出 h32
      

3. 字串函數和方法

str() 和 len() 函數

  • str():將輸入轉換為字串。

    • 範例:
      string_id = str(19329302)  # 將整數轉換為字串
      
  • len():傳回字串中的元素數量。

    • 範例:
      device_id_length = len("h32rb17")
      if device_id_length == 7:
          print("The device ID has 7 characters.")
      

.upper() 和 .lower() 方法

  • .upper():將字串中的所有字母轉換為大寫字母。

    • 範例:
      print("Information Technology".upper())  # 輸出 INFORMATION TECHNOLOGY
      
  • .lower():將字串中的所有字母轉換為小寫字母。

    • 範例:
      print("Information Technology".lower())  # 輸出 information technology
      

.index() 方法

  • .index():尋找字串中第一次出現的字元或子字串,並傳回其索引。

    • 範例:
      print("h32rb17".index("r"))  # 輸出 3
      
    • 注意:如果字串中有多個相同字元,.index() 只會傳回第一個實例的位置。
  • .index() 尋找子字串:可以用來尋找子字串的第一次出現位置。

    • 範例:
      tshah_index = "tsnow, tshah, bmoreno - updated".index("tshah")
      print(tshah_index)  # 輸出 7
      

4. 重點整理

  • 字串索引與切片:使用索引提取字串中的字元或某部分資料。
  • 常用函數
    • str():將輸入轉換為字串。
    • len():返回字串的長度。
  • 字串方法
    • .upper():將字串中的所有字母轉為大寫。
    • .lower():將字串中的所有字母轉為小寫。
    • .index():尋找字串或子字串的第一次出現並傳回其索引。

Python 列表的使用與操作

1. 列表的基本概念

  • 列表 是一種能夠將多條資料存儲在一個變數中的數據類型。它非常適合在安全行業中儲存如 IP 位址、應用程式等多個條目。
  • 列表使用方括號 [] 包裹,並且項目之間用逗號 , 分隔。
    • 範例:
      my_list = ["A", "B", "C", "D", "E"]
      

2. 列表中的索引與元素存取

  • 索引:每個列表中的元素都有一個對應的索引,從 0 開始計算,負索引從 -1 開始。
    • 範例:
      my_list = ["A", "B", "C", "D", "E"]
      print(my_list[1])  # 輸出 "B"
      
      • my_list[1] 表示列表中的第二個元素。
  • 切片:可以使用範圍切片來提取多個元素。
    • 範例:
      print(my_list[0:3])  # 輸出 ["A", "B", "C"]
      
      • 切片從起始索引開始,直到結束索引前一位結束。

3. 列表的串聯

  • 列表串聯:使用加號 + 可以將兩個列表合併為一個新的列表。
    • 範例:
      my_list1 = ["A", "B", "C"]
      my_list2 = [1, 2, 3]
      combined_list = my_list1 + my_list2
      print(combined_list)  # 輸出 ["A", "B", "C", 1, 2, 3]
      

4. 列表的可變性

  • 列表是可變的:與字串不同,列表可以在創建後進行修改,包括新增、修改和刪除元素。
    • 範例:修改列表中的元素
      my_list = ["A", "B", "C"]
      my_list[1] = 7  # 將第二個元素 "B" 改為 7
      print(my_list)  # 輸出 ["A", 7, "C"]
      

5. 列表方法操作

(1) 插入元素:insert()

  • insert() 方法:將新元素插入到指定位置,該方法的第一個參數為索引,第二個參數為要插入的元素。
    • 範例:
      my_list = ["A", "B", "C"]
      my_list.insert(1, 7)  # 在索引 1 處插入數字 7
      print(my_list)  # 輸出 ["A", 7, "B", "C"]
      
      • 注意:插入操作會將後面的元素向後移位。

(2) 刪除元素:remove()

  • remove() 方法:刪除列表中第一次出現的特定元素。
    • 範例:
      my_list = ["A", "B", "C", "D"]
      my_list.remove("D")  # 刪除元素 "D"
      print(my_list)  # 輸出 ["A", "B", "C"]
      
      • 注意:remove() 直接根據值刪除,而不是索引。

6. 列表與字串的相似與差異

  • 相似性:列表和字串都支援索引和切片操作,可以使用相同的方式來訪問它們的元素。
  • 差異性
    • 字串是不可變的,無法在創建後進行修改。
    • 列表是可變的,您可以新增、修改和刪除其中的元素。

7. 安全行業中的應用場景

  • 在安全行業中,列表廣泛應用於儲存如 IP 位址、惡意軟體名單等數據。
  • 舉例:可以動態地向惡意 IP 位址列表中新增新的威脅:
    malicious_ips = ["192.168.1.1", "10.0.0.2"]
    malicious_ips.append("172.16.0.3")  # 新增一個新的 IP
    print(malicious_ips)  # 輸出 ["192.168.1.1", "10.0.0.2", "172.16.0.3"]
    

解決問題的演算法:提取IP位址中的前三位數字

1. 演算法的概念

  • 演算法:一組解決問題的規則或步驟。具體來說,它是從問題中取得輸入,經過處理後返回一個解決方案作為輸出。
    • 例子:煮咖啡的過程就是一個演算法——一個解決特定問題(如何煮咖啡)的規則集。

2. 使用演算法解決問題:IP 位址提取

  • 作為一名安全分析師,您可能會遇到一個包含多個 IP 位址的列表。您的目標是從每個 IP 位址中提取前三位數字,這可以幫助您識別其所屬的網路。
  • 步驟分解
    1. 提取單個 IP 位址的前三位數字
    2. 使用循環對每個 IP 位址進行同樣操作

3. 實現第一步:提取單個 IP 位址的前三位數字

  • 假設有一個 IP 位址 "198.567",我們可以通過字串切片來提取前三位數字。
    • 使用括號表示法來進行字串切片:
      address = "198.567"
      print(address[0:3])  # 輸出 "198"
      
      • 說明:address[0:3] 提取索引 0 到 2 的字元,索引 3 是切片的結束位置,但不包括在內。

4. 實現第二步:對列表中的每個 IP 位址進行處理

  • 假設有一個包含多個 IP 位址的列表,我們將使用循環遍歷每個 IP,並對其進行相同的提取操作。
  • 使用 append() 方法:將提取的前三位數字新增到一個新列表中。
    • append() 方法的作用是將元素新增到列表末尾。
    • 範例:
      ip_list = ["198.567", "123.456", "156.789"]
      network_list = []
      
      for address in ip_list:
          network_list.append(address[0:3])
      
      print(network_list)  # 輸出 ['198', '123', '156']
      

5. 分解步驟說明

(1) 建立空列表

  • network_list = []:這個列表用來存儲每個 IP 位址提取出的前三位數字。

(2) 使用 for 迴圈遍歷列表

  • for address in ip_list::這行程式碼告訴 Python 我們要開始一個循環,並逐一處理 ip_list 中的每個 IP 位址。
    • 每次循環中,address 會暫時存儲當前的 IP 位址。

(3) 提取前三位數字並新增到列表中

  • network_list.append(address[0:3]):使用字串切片來提取 IP 位址的前三位數字,並使用 append() 將其新增到 network_list 中。

(4) 列印結果

  • print(network_list):輸出包含每個 IP 位址前三位數字的新列表。

6. 演算法的應用與擴展

  • 此方法可應用於各種日常和安全分析中的資料處理任務,如提取 IP 位址的特定部分、過濾不需要的資料等。
  • 此外,理解如何利用字串操作和列表處理來解決問題,是成為合格安全分析師的重要技能。

7. 重點回顧

  • 演算法 是解決問題的一組規則,Python 中可通過循環、字串切片和列表操作來實現。
  • append() 方法 是將元素新增到列表末尾的重要工具。
  • 字串切片 允許我們提取字串的某部分,並應用於每個列表元素。
  • 列表與循環 結合,可以批量處理資料,實現自動化的數據提取。

Python 列表操作:刪除、追加和查找元素

1. 刪除元素:remove() 方法

  • remove() 方法:從列表中刪除第一次出現的指定元素。注意,該方法僅刪除元素的第一個實例。

    • 範例:
      username_list = ["elarson", "bmoreno", "wjaffrey", "tshah", "sgilmore"]
      print("Before removing an element:", username_list)
      
      username_list.remove("elarson")  # 刪除 "elarson"
      
      print("After removing an element:", username_list)
      
    • 輸出:
      在刪除元素之前: ['elarson', 'bmoreno', 'wjaffrey', 'tshah', 'sgilmore']
      刪除元素後: ['bmoreno', 'wjaffrey', 'tshah', 'sgilmore']
      
  • 重要提示:如果列表中有多個相同的元素,remove() 方法僅會刪除第一次出現的那個元素,而不會刪除所有的實例。


2. 追加元素:append() 方法

  • append() 方法:將新元素添加到列表的末尾。此方法對列表進行原地修改,不影響已有元素的順序。

    • 範例:
      username_list = ["bmoreno", "wjaffrey", "tshah", "sgilmore"]
      print("Before appending an element:", username_list)
      
      username_list.append("btang")  # 將 "btang" 加入列表末尾
      
      print("After appending an element:", username_list)
      
    • 輸出:
      在追加元素之前: ['bmoreno', 'wjaffrey', 'tshah', 'sgilmore']
      追加元素後: ['bmoreno', 'wjaffrey', 'tshah', 'sgilmore', 'btang']
      
  • 應用場景append() 方法經常與 for 迴圈結合使用來填充空列表。

    • 範例:使用 for 迴圈填充列表
      numbers_list = []
      print("Before appending a sequence of numbers:", numbers_list)
      
      for i in range(10):
          numbers_list.append(i)  # 將 0 到 9 加入列表
      
      print("After appending a sequence of numbers:", numbers_list)
      
    • 輸出:
      在附加數字序列之前: []
      加入數字序列後: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      

3. 查找元素索引:index() 方法

  • index() 方法:傳回列表中第一次出現的指定元素的索引。

    • 範例:
      username_list = ["bmoreno", "wjaffrey", "tshah", "sgilmore", "btang"]
      username_index = username_list.index("tshah")  # 查找 "tshah" 的索引
      
      print(username_index)  # 輸出 2
      
    • 輸出:
      2
      
  • 注意:如果列表中有重複的元素,index() 方法只會返回該元素第一次出現的位置。


4. 重點回顧

  • remove() 方法:刪除列表中的第一次出現的指定元素。
  • append() 方法:在列表的末尾添加新元素。
  • index() 方法:返回指定元素的第一次出現的索引。
  • 列表與字串的操作不同:雖然 .index() 方法同樣存在於字串和列表中,但它們是針對不同的資料類型而定義的。

這些列表操作是處理資料集合的基本方法,尤其在安全分析等領域,列表操作可以幫助管理和處理大批量的數據。

使用正規表示式 (Regex) 搜尋字串中的模式

1. 正規表示式的介紹

  • 正規表示式 (Regex) 是一組用來定義字串模式的字符序列。
  • 正規表示式可用於在文字或日誌中搜尋特定模式,這在安全性分析中非常有用。例如,可以搜尋所有以特定前綴開頭的字串,或篩選出符合一定格式的資料。
  • 應用場景
    • 搜尋特定網路ID的所有IP位址。
    • 提取日誌中的所有電子郵件地址。

2. 為什麼使用正規表示式?

  • 普通搜尋:如果使用字串索引方法,只能查找具體的字串,無法靈活地處理變化多端的資料。
  • 正規表示式搜尋:我們可以定義模式來搜尋結構化的資料,而不需要知道具體的內容。例如,可以使用正規表示式來匹配電子郵件地址的結構。

3. 正規表示式的基本符號

(1) 加號 (+)

  • 加號 (+):匹配前面的字元一次或多次出現。
    • 例如:a+ 匹配一個或多個連續的 "a"。
    • 範例:
      import re
      device_ids = "a aa aaa aaaa"
      matches = re.findall(r"a+", device_ids)
      print(matches)  # 輸出 ['a', 'aa', 'aaa', 'aaaa']
      

(2) \w 符號

  • \w:匹配任何字母、數字或底線字符(但不包括符號)。
    • 例如,\w 可以匹配 "1", "k", "i" 等字元。
    • 範例:
      text = "abc123!@#"
      matches = re.findall(r"\w+", text)
      print(matches)  # 輸出 ['abc123']
      

(3) 組合符號

  • \w+:匹配任意長度的字母數字字串。這是常見的正規表示式組合,能夠匹配變長的字母數字序列。
    • 範例:
      text = "192 abc123 security"
      matches = re.findall(r"\w+", text)
      print(matches)  # 輸出 ['192', 'abc123', 'security']
      

4. 使用正規表示式提取電子郵件地址

  • 電子郵件的結構
    1. 字母數字字符 + @ 符號 + 網域名 + . 符號 + 領域(如 com, net 等)。
    2. 對應的正規表示式:
      • \w+:匹配字母數字字符序列(用於匹配電子郵件的前半部分和網域名部分)。
      • @:匹配 @ 符號。
      • \.:匹配 . 符號,因為 . 在正規表示式中有特殊含義,因此需要加反斜線來進行轉義。
  • 完整的電子郵件匹配正規表示式
    \w+@\w+\.\w+
    

範例:提取日誌中的電子郵件地址。

import re

email_log = """
user1@email1.com
user2@email2.net
notAnEmail@random
"""

email_pattern = r"\w+@\w+\.\w+"
emails = re.findall(email_pattern, email_log)
print(emails)  # 輸出 ['user1@email1.com', 'user2@email2.net']

使用 re 模組進行正規表示式操作

Python 中的 re 模組提供了正規表示式的支持。最常用的方法是 re.findall(),它會傳回所有符合正規表示式的匹配結果。
範例

import re

text = "Here are some emails: user1@example.com, user2@domain.org"
pattern = r"\w+@\w+\.\w+"
matches = re.findall(pattern, text)

print(matches)  # 輸出 ['user1@example.com', 'user2@domain.org']

正規表示式的進階應用與 re 模組

  1. 使用 re.findall() 函數
    re.findall():re 模組中的一個常用函數,用來搜尋符合正規表示式的所有字串,並返回一個列表。
    它需要兩個參數:
    正規表示式模式(字串形式)。

要搜尋的字串。

範例:

import re
result = re.findall("ts", "tsnow, tshah, bmoreno")
print(result)  # 輸出 ['ts', 'ts']
  1. 正規表示式符號
    (1) 字元類型的符號
    \w:匹配任何字母、數字或底線字符 (_)。

\d:匹配任何單一數字 (0-9)。

\s:匹配任何單一空格字符(包括空格、tab等)。

.:匹配任何字符(包括符號)。

範例:

import re
device_id = "h32rb17"
result = re.findall("\w", device_id)
print(result)  # 輸出 ['h', '3', '2', 'r', 'b', '1', '7']

使用 \d 搜尋字串中的所有數字:

result = re.findall("\d", device_id)
print(result)  # 輸出 ['3', '2', '1', '7']

https://ithelp.ithome.com.tw/upload/images/20240928/20026585uxE8LIHbqX.png


上一篇
【Google資安證書重點整理】Day 26_Python常用的指令
下一篇
【Google資安證書重點整理】Day 28_Python常用的指令二
系列文
【Google資安證書課程重點整理】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言