一句話說明

AI 寫自動化腳本很快,但常常在指令注入、路徑檢查、金鑰管理這幾個地方留下漏洞,跑之前一定要自己看過每一行。

AI 擅長自動化的工作

檔案整理。批次重新命名、依日期或類型分類、找出重複檔案,這類規則明確、輸入輸出格式固定的工作,AI 寫起來又快又準。

日誌解析。從幾萬行的 log 裡篩出錯誤訊息、統計某個錯誤碼出現的頻率、把不同格式的 log 轉成統一的結構,這是 AI 的強項,因為規則可以用正規表達式清楚定義,而且結果容易驗證。

資料格式轉換。CSV 轉 JSON、Excel 轉資料庫、把多個檔案合併成一份報表,這類任務結構清楚,AI 寫的轉換腳本出錯機率低,就算出錯也容易從輸出格式看出來。

API 呼叫整合。串接多個服務的 API、定期抓取資料、把不同系統的資料同步在一起,AI 對常見 API(Slack、Google Sheets、Notion 等)的呼叫方式很熟悉,寫起來效率很高。

排程任務。用 cron 或排程器定期執行備份、清理暫存檔、寄送報表,這類任務邏輯單純、失敗了重跑一次通常沒有副作用。

報表產出。把資料庫查詢結果整理成固定格式的報表,定期寄給主管或存到共用資料夾,這是很多內部工具最常見的自動化需求之一。

AI 不該用來自動化的工作

任何直接碰觸正式環境資料庫的操作。UPDATE、DELETE、批次修改正式資料這類指令,一旦 AI 寫的邏輯有誤(例如 WHERE 條件寫錯),後果可能是不可逆的資料損毀。這類腳本可以讓 AI 協助草擬,但執行前必須有資深工程師逐行審核,並且先在測試環境跑過。

金流或財務交易相關的自動化。轉帳、退款、發票產出這類牽涉到金錢的流程,任何邏輯錯誤都直接變成財務損失或法遵問題,不適合讓 AI 寫的腳本沒有人工複核就直接上線。

需要精確錯誤復原機制的場景。例如分散式系統裡的交易補償、需要保證「要嘛全部成功、要嘛全部回滾」的流程,這類邏輯需要對系統狀態有深入理解,AI 生成的錯誤處理常常只是把例外包起來印出訊息,沒有真正處理復原邏輯。

AI 生成腳本常見的安全風險

一、Shell Injection(指令注入)

AI 很習慣用字串拼接的方式組出要執行的指令,而不是用陣列參數傳遞,這是指令注入最常見的來源。

不好的寫法:

import os
filename = input("請輸入檔名:")
os.system(f"cat {filename}")

如果使用者輸入 report.txt; rm -rf ~,這段指令會變成先印出 report.txt 的內容,再刪除使用者的家目錄。

比較安全的寫法:

import subprocess
filename = input("請輸入檔名:")
subprocess.run(["cat", filename], check=True)

用陣列傳參數而不是拼字串,shell 就不會把輸入內容當成指令的一部分解析。如果一定要用到 shell 特性(例如管線),至少要對輸入做嚴格的白名單驗證。

二、Path Traversal(路徑遍歷)

AI 寫的檔案處理腳本,很少主動驗證使用者輸入的路徑是不是在預期的資料夾範圍內。

不好的寫法:

def read_user_file(filename):
    with open(f"/data/uploads/{filename}") as f:
        return f.read()

如果 filename 是 ../../etc/passwd,這段程式碼就會讀到系統檔案,超出原本 /data/uploads/ 這個範圍。

比較安全的寫法:

from pathlib import Path

def read_user_file(filename):
    base = Path("/data/uploads").resolve()
    target = (base / filename).resolve()
    if not target.is_relative_to(base):
        raise ValueError("非法路徑")
    return target.read_text()

關鍵是把路徑解析成絕對路徑之後,確認它真的還在允許的目錄底下,而不是只檢查檔名字串裡有沒有 ..

三、硬編碼金鑰

AI 為了讓範例程式碼能夠直接跑,很習慣把 API 金鑰直接寫在程式碼裡示範。

不好的寫法:

API_KEY = "sk-live-abc123xyz789"
response = call_api(API_KEY)

這種寫法一旦程式碼被 commit 進 Git,金鑰就永久留在版本歷史裡,就算之後刪掉也還查得到。

比較安全的寫法:

import os
API_KEY = os.environ.get("API_KEY")
if not API_KEY:
    raise EnvironmentError("請設定 API_KEY 環境變數")
response = call_api(API_KEY)

金鑰放在環境變數或密鑰管理服務(例如 AWS Secrets Manager、HashiCorp Vault)裡,程式碼本身完全不出現金鑰內容,並且記得把 .env 這類檔案加進 .gitignore

四、過度授權

AI 遇到權限錯誤時,最快的解法常常是把權限開到最大,而不是找出真正需要的最小權限。

不好的寫法:

chmod 777 /var/www/uploads

這讓任何使用者都能讀寫執行這個目錄下的檔案,等於把伺服器的門完全打開。

比較安全的寫法:

chmod 750 /var/www/uploads
chown www-data:www-data /var/www/uploads

只給實際需要的使用者和群組權限,並且區分讀、寫、執行分別要不要開放。同樣的問題也常出現在「腳本要不要用 sudo 執行」,能不用 root 權限跑的腳本就不要用。

五、缺乏錯誤處理

AI 生成的腳本常常沒有考慮失敗情境,要嘛整個崩潰不留紀錄,要嘛遇到錯誤還繼續往下跑,留下不完整的結果卻沒有任何警訊。

不好的寫法:

for file in files:
    process(file)
    upload(file)

如果某個檔案處理到一半失敗,迴圈可能直接中斷,也可能靜默略過,你完全不知道哪些檔案真正處理完成。

比較安全的寫法:

import logging

failed = []
for file in files:
    try:
        process(file)
        upload(file)
    except Exception as e:
        logging.error(f"處理 {file} 失敗:{e}")
        failed.append(file)

if failed:
    logging.warning(f"共有 {len(failed)} 個檔案處理失敗:{failed}")

每一步都記錄下來,失敗的項目集中列出,讓你事後能明確知道哪些需要重跑,而不是猜。

執行 AI 生成腳本前的檢查清單

一、逐行讀過整個腳本,特別留意 rmcurlchmodsudoos.systemevalexec 這幾個關鍵字出現的地方,弄清楚每一行實際會做什麼,不要因為腳本看起來很短就跳過。

二、先在沙盒或測試環境跑一次。可以是一個獨立的 Docker 容器、一台測試機、或至少是一個內容無關緊要的資料夾,絕對不要第一次執行就對著正式環境或重要資料跑。

三、檢查有沒有硬編碼的密鑰或密碼,搜尋腳本裡是否出現 keypasswordtokensecret 這類字樣後面接著實際的字串值。

四、確認所有牽涉到檔案路徑的操作,特別是有使用者輸入或外部資料來源的路徑,都經過驗證,不會被帶出預期的資料夾範圍。

五、檢查腳本有沒有對外的網路呼叫,確認資料實際上會送到哪裡去,尤其是 AI 建議安裝的第三方套件或呼叫的第三方 API,弄清楚你的資料是不是正在被送往你不知道的地方。

安全生成腳本的 Prompt 範本

與其寫完再檢查,更有效率的做法是一開始下 Prompt 時就把安全要求寫進去。

請幫我寫一個 Python 腳本,功能是〔描述你的需求〕。 要求: 1. 所有外部指令使用 subprocess 的陣列參數呼叫,不要用字串拼接或 shell=True 2. 所有檔案路徑操作要先驗證是否在允許的目錄範圍內 3. 所有密鑰、Token 從環境變數讀取,不要寫死在程式碼裡 4. 每個可能失敗的步驟都要有 try/except,並記錄清楚的錯誤訊息 5. 檔案或系統權限設定使用最小必要權限,不要用 777 或 sudo,除非你先說明為什麼一定需要 請在程式碼之後,列出這個腳本可能有風險的地方讓我確認。

最後一句特別重要,讓 AI 自己列出風險點,往往能幫你抓到一開始沒想到的問題,但這不能取代你自己逐行檢查,AI 列出的風險清單本身也可能不完整。

知識檢測

讀完文章後,測試一下你對這個主題的理解。

FAQ

AI 寫的腳本可以直接排進 cron 定期執行嗎?

第一次不建議。先手動執行幾次,確認輸出符合預期、錯誤處理正常,觀察一段時間再排入排程。排程前也要確認腳本有寫日誌,這樣排程執行出問題時你才查得到原因。

用 AI 生成的腳本要不要做 Code Review?

要,而且和人寫的程式碼用同樣的標準審查,甚至更嚴格一點。因為 AI 生成的程式碼常常「看起來很專業」,容易讓人放鬆警覺,反而略過原本該有的審查步驟。

我不會寫程式,可以完全依賴 AI 生成的自動化腳本嗎?

可以用 AI 生成,但至少要能看懂每一行在做什麼,或者找一位同事幫忙看過再執行。完全看不懂就直接跑,等於把伺服器或電腦的控制權交給你自己都無法驗證的程式碼。

哪些程式語言用 AI 寫自動化腳本風險比較高?

Shell 腳本(Bash)的風險通常比 Python、Node.js 高,因為 shell 語法對特殊字元、空白、引號的處理方式容易產生意料之外的行為,指令注入的門檻也比較低。如果任務用 Python 或 Node.js 能達成,優先選擇這兩者,並且盡量避免在腳本裡直接呼叫 shell 指令。

AI 生成的腳本裡出現我看不懂的套件或指令怎麼辦?

先查清楚這個套件或指令實際的功能再執行,不要因為 AI 講得很有信心就直接相信。可以直接問 AI「這行在做什麼、為什麼需要這個套件」,如果解釋含糊或找不到官方文件佐證,就先不要執行。