跳至主要內容
>_ITDITD網站資安平台

各框架對策

Django 的資安對策 — DEBUG、SECRET_KEY、授權的守法

Django 備有安全的預設,但事故來自設定:正式環境 DEBUG=True(設定/機密外洩)、SECRET_KEY 外洩,以及授權太薄。設 DEBUG=False、從環境變數載入 SECRET_KEY、把授權寫明確。以防禦視角講解,不含攻擊步驟。

發布於 2026-07-02 更新於 2026-07-02 閱讀時間 2 分鐘

對象:正在維運 Django 應用程式的人。這裡不談攻擊步驟,只講如何讓安全的預設持續生效,同時補起設定所開的破口。想看全貌,請參閱 各框架資安對策的入口

三大陷阱(開在設定上)

Django 的預設很出色,但下面這三點是要在設定與程式碼裡去守的領域

① 正式環境 DEBUG=True

錯誤頁面暴露設定、環境變數、機密。透過故意的錯誤被抽出。

② SECRET_KEY 外洩

簽章/工作階段/CSRF 的基礎。外洩有偽造與竄改之虞。

③ 授權太薄

有驗證卻缺少權限/擁有者檢查。換個 ID 就看到他人的資料。

Django 最容易開的三大破口。全都在預設/設定的外側。

此外,也要留意 raw()/extra() 或字串串接造成的 SQLi不安全的反序列化pickle)、未設定的 ALLOWED_HOSTS,以及放任相依套件(pip)的 CVE

補起來的方法(3 步驟)

1

正式環境 DEBUG=False+ALLOWED_HOSTS

正式環境務必確保 DEBUG=False,並正確設定 ALLOWED_HOSTS。停止把詳細錯誤顯示給外部,並把靜態/媒體檔的供應設定成正式環境用。把它納入部署流程,每次都確認。
2

從環境變數載入 SECRET_KEY、保持非公開

別把 SECRET_KEY 寫進程式碼/版本庫——從環境變數或機密管理載入。避免它出現在公開目錄與 DEBUG 頁面,萬一外洩要立刻輪替(→ 別把機密資訊放進公開目錄)。
3

把授權寫明確、切斷危險的輸入路徑

別停在登入(驗證);把權限/擁有者範圍的授權寫明確。使用 ORM/佔位符,避免在 raw() 裡做字串串接,也別用 pickle 還原不可信的資料。相依套件(pip)保持 CVE 監控+迅速修補(→ IDOR 是什麼)。

常見(危險)

  • 正式環境仍是 DEBUG=True
  • SECRET_KEY 直接寫進程式碼/版本庫
  • 不寫授權——「已登入=可檢視」
  • raw() 字串串接 · 對不可信資料用 pickle

正確

  • 正式環境 DEBUG=False+ALLOWED_HOSTS
  • SECRET_KEY 從環境變數、保持非公開
  • 明確的授權(權限/擁有者範圍)
  • ORM/佔位符,不對不可信資料做反序列化

本站的觀點:電池內建,但設定與授權在你身上

Django 預設替你守住很多,但正式環境設定(DEBUG/SECRET_KEY/ALLOWED_HOSTS)授權是要按環境、按應用程式各自做對的事。我們反覆看到的事故,與其說是精巧的攻擊,不如說是設定/維運的型態:「正式環境開著除錯」「機密被暴露」「沒有授權」。所以防禦的重心是:收緊正式環境設定、把機密保持非公開、把授權寫明確。不去毀掉那些穩固的預設,正是維運 Django 的關鍵。

接下來讀

FAQ

QDjango 是安全的框架嗎?
A

Django 奉行『電池內建』——基於 ORM 的 SQL 防護、CSRF 保護、樣板自動跳脫、認證系統都是標準配備。設定正確它是很穩固的框架,但事故不是來自核心,而是來自設定。正式環境 DEBUG=True、SECRET_KEY 外洩、授權太薄,與其說是 Django 特有的問題,不如說是反覆發生的維運/設定問題。

Q正式環境保留 DEBUG=True 有什麼危險?
A

DEBUG 開著時,錯誤頁面可能顯示詳細的內部資訊——設定值、環境變數、堆疊追蹤。攻擊者可以故意觸發錯誤把它們抽出來。正式環境務必設 DEBUG=False,並正確設定 ALLOWED_HOSTS。同時要停止把詳細錯誤顯示給外部,並檢視靜態/媒體檔的正式環境供應方式。

QSECRET_KEY 為什麼重要?
A

SECRET_KEY 是簽章 Cookie 與工作階段、CSRF token、密碼重設等機制底下的金鑰。一旦外洩,就可能導致對這些進行偽造或竄改。別把 SECRET_KEY 寫進程式碼或版本庫——從環境變數或機密管理載入,萬一外洩要立刻輪替。也要避免它透過公開目錄或 DEBUG 頁面被暴露。