萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

CGI 腳本安全開發實戰指南

核心原則:所有輸入皆不可信

Bill Gates 曾言:「All input is invalid.」這句話精準概括了 Web 安全的基石。無論是顯式參數 (Query String、表單欄位) 還是隱式輸入 (Cookie、HTTP Header、環境變數),皆為攻擊面。

一、嚴格驗證與限定輸入

錯誤示範:路徑遍歷與原始碼洩露

# unsafe.cgi
$filepath = "/var/www/bbs/";
$filename = $query->param('page');
$filename = "$filepath/$filename";
open(FILE, $filename);  # 直接使用用戶輸入
while (<FILE>) { print $_; }
close(FILE);

攻擊者請求 ?page=../../../../etc/passwd 即可讀取敏感檔案;若傳入 ?page=unsafe.cgi 甚至能獲取腳本原始碼。後續嘗試以 .html 後綴限制,仍可利用 NULL 字元 (%00) 繞過。

正確做法:白名單正則限定

# 僅允許英數字、底線、連字號、點號
my $allowed = qr/^[\w\-\.]+$/;
my $page = $query->param('page') || 'index.html';
die "非法參數" unless $page =~ $allowed;
# 進一步檢查檔案是否存在於允許目錄

電子郵件驗證範例:

if ($email !~ /^[\w\.-]+\@[\w\.-]+$/) {
    &error("郵件格式錯誤");
}

二、危險函數與特殊字元管控

函數/字元風險對策
system(), exec()執行任意系統指令避免使用;若必須用,嚴格白名單驗證所有參數
open() 搭配 >, |任意檔案寫入/指令執行禁止用戶輸入控制檔名;使用三參數 open 模式
反引號 `cmd`同 system()同左
分號 ;, 管道 |, 重導向 > <指令注入、流程控制繞過輸入白名單過濾,拒絕所有元字元
反斜線 \ 逃逸繞過簡單過濾器使用成熟的逃逸函數庫 (如 CGI.pm)
尖括號 <>跨站腳本 (XSS)輸出時進行 HTML 實體編碼

三、認證與授權邏輯完整性

  • 避免「先檢查權限、再執行」中間可被竄改 (TOCTOU);採用原子性操作。
  • Session ID 需具備高熵值、定期輪換、HttpOnly、Secure 標記。
  • 敏感操作 (刪除、權限變更) 必須採用 POST + CSRF Token 雙重保護。

四、防禦深度清單

  1. 啟用 Taint 模式 (Perl -T),強制檢查外部數據流向。
  2. 部署 WAF (ModSecurity) 針對已知攻擊特徵進行虛擬補丁。
  3. 最小權限原則:Web 執行身份僅具備必要目錄讀寫權限,禁止 Shell 存取。
  4. 定期代碼審計與自動化掃描 (如 Flawfinder、RIPS)。

結語

CGI 安全不在於語言選擇,而在於開發者是否建立「零信任」輸入處理習慣。白名單驗證、最小權限、輸出編碼、纵深防禦——四大支柱缺一不可。

copyright © 萬盛學電腦網 all rights reserved