從用戶那裡接收檔案的機制很方便,但如果設計不當,可能會導致重大漏洞。攻擊者會利用上傳來嘗試執行任意代碼、耗盡伺服器容量、分發不正當檔案等。
代表性的威脅如下:
對策的基本是「多層防禦」。有效的設計是不依賴於單一對策,而是重疊多個防禦層。
限制允許的擴展名,不僅根據擴展名來決定接受與否。需檢查檔案的簽名(魔術數字)來驗證其內容。不要信任 Content-Type 標頭,並實施處理以防止雙重擴展名和 NULL 字節等規避方法。
請不要直接保存用戶提供的檔名。使用 UUID 或哈希 + 時間戳等替換為唯一名稱,同時將原檔名作為元數據另行保存,這樣的設計更安全。特殊字符和長度限制也需處理。
上傳的檔案應保存於網頁根目錄外,以防直接執行。如果可能,將檔案保存到專用的物件存儲(例如:S3)中,並通過應用發行下載鏈接。保存資料夾應限制最低的讀寫權限而不賦予執行權限。
設置檔案大小上限,導入同時上傳數量和速率控制,以確保服務的可用性。對於接受壓縮檔(如 ZIP 等)的情況,還需檢查解壓後的每個檔案。
在上傳後立即執行病毒掃描(如果可能,使用多個引擎),並使用 CDR(內容消除和重建)對 PDF/Office 等進行無害化處理。對於圖像,重新編碼(讀取→生成新檔案)以去除嵌入的惡意數據會更有效。
通信必須使用 TLS(HTTPS)進行保護,並實施 CSRF 令牌等對策。在下載響應中附加 Content-Disposition: attachment
和 X-Content-Type-Options: nosniff
以防止瀏覽器誤操作。
詳細記錄誰在什麼時候處理了哪些檔案,並設置異常行為(高頻上傳或大量拒絕)的警報。保留哈希值以確保檔案的完整性也是有效的。
實施後需針對檔案上傳進行專門的漏洞測試(外殼注入、擴展名規避、路徑遍歷等),並定期檢視。
在這裡介紹的 UploadF(uploadf.com),無論是在 PC 或手機上均可用,還支持拖放與 100 檔案同時上傳等便利性,同時在服務設計中也需要注意以下事項和巧思。
檢查項目 | 實施/確認要點 |
---|---|
擴展名白名單限制 | 僅允許必要的格式。黑名單輔助使用。 |
MIME/簽名檢查 | 驗證擴展名和內容是否一致(檢查魔術數字)。 |
檔名重新命名 | 替換為 UUID 或哈希名,並通過元數據管理原始名稱。 |
特殊字符去除 | 去除或拒絕 `/`, `\`, `..`, NULL 等。 |
保存目錄 | 保存於 Web 根目錄外或物件存儲中。 |
資料夾權限 | 禁止執行,並採取最小讀寫權限(最低權限原則)。 |
最大/最小檔案大小 | 明示上限,並檢查 ZIP 等展開後的檔案。 |
同時上傳控制 | 限制並行數、速率控制、設置超時。 |
病毒掃描 / CDR | 進行上傳即時掃描及必要的無害化處理。 |
通信加密 (HTTPS) | 強制使用 TLS(防止中間人攻擊)。 |
CSRF 對策 | 引入基於令牌的檢查。 |
響應標頭設置 | 附加 Content-Disposition: attachment 、X-Content-Type-Options: nosniff 等。 |
日誌記錄 & 警報 | 監控上傳行為,並在異常時進行通知。 |
定期安全審查 | 定期執行漏洞測試和滲透測試。 |
舊檔案的自動刪除 | 在保留期限過後進行完全消除設計。 |
訪問控制/授權 | 嚴格管理以用戶或小組為單位的訪問權限。 |
檔案上傳功能同時具備便利性與風險。通過在設計中納入多層防禦(白名單、簽名檢查、保存位置分離、惡意程式對策、日誌審計等),可以大幅降低攻擊風險。
對於用戶而言,能夠感受到「既簡便又安全」的表達非常重要。例如,像 UploadF(uploadf.com) 這樣擁有個別刪除或保存期間設置等功能的服務,會更容易帶來安全感。
※ 以上是文章撰寫時的參考來源示例。更詳細的實施資料和最新的威脅信息,請參閱各自的官方文檔。