安全模型
執行時期安全性
Hugo 產生靜態輸出,因此一旦建置完成,執行時期就是瀏覽器(假設輸出是 HTML)和任何您整合的伺服器(API)。
但在開發和建置網站時,執行時期是 hugo
執行檔。保護執行時期可能是一個真正的挑戰。
Hugo 的主要方法是沙盒化和具有嚴格預設值的安全性政策:
- Hugo 有一個虛擬檔案系統,只有主要專案(而非第三方元件)允許掛載專案根目錄以外的目錄或檔案。
- 使用者定義的元件對檔案系統有唯讀存取權。
- 我們會使用一些外部二進位檔案來支援 Asciidoctor 等功能,但這些二進位檔案及其參數是預先定義的,且預設為停用(請參閱安全性政策)。由於安全性考量,雖然有討論過執行任意外部作業系統命令的一般功能,但尚未實作。
安全性政策
Hugo 有一個內建的安全性政策,限制對 os/exec
、遠端通訊等的存取。
預設配置如下所列。使用任何不在安全性政策允許清單中的功能的建置都會失敗,並顯示詳細訊息說明需要做什麼。這些設定大多是允許清單(字串或切片、正規表達式或不匹配任何內容的 none
)。
[security]
enableInlineShortcodes = false
[security.exec]
allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^git$', '^npx$', '^postcss$', '^tailwindcss$']
osEnv = ['(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG|SYSTEMDRIVE)$']
[security.funcs]
getenv = ['^HUGO_', '^CI$']
[security.http]
methods = ['(?i)GET|POST']
urls = ['.*']
預設情況下,Hugo 允許 resources.GetRemote
函式下載具有與內部允許清單相對應的媒體類型的檔案。要新增媒體類型到允許清單:
[security.http]
mediaTypes = ['^image/avif$']
請注意,這些和 Hugo 中的其他配置設定可以被作業系統環境變數覆寫。例如,如果您想要阻擋所有遠端 HTTP 資料擷取:
HUGO_SECURITY_HTTP_URLS=none hugo
相依性安全性
Hugo 使用 Go Modules 來管理其相依性,並建置為靜態二進位檔。Go Modules 有幾個安全防護措施,其中之一是 go.sum
檔案。這是一個包含所有相依性(包括遞移相依性)的預期加密校驗和的資料庫。
Hugo Modules 是建立在 Go Modules 功能之上的功能。與 Go Modules 一樣,使用 Hugo Modules 的 Hugo 專案會有一個 go.sum
檔案。我們建議您將此檔案提交到您的版本控制系統。如果出現校驗和不符的情況(這可能表示相依性被竄改),Hugo 建置將會失敗。
Web 應用程式安全性
這些是由 OWASP 定義的安全性威脅。
對於 HTML 輸出,這是核心安全性模型:
https://pkg.go.dev/html/template#hdr-Security_Model
簡而言之:
- 模板和配置作者(您)是受信任的,但您送入的資料不是。
這就是為什麼您有時需要使用 safe
函式(如 safeHTML
)來避免轉義您知道安全的資料。
上述有一個例外,如文件中所註明:如果您啟用行內短碼,您也表示內容檔案中的短碼和資料處理是受信任的,因為這些巨集被視為純文字。
值得一提的是,Hugo 是一個靜態網站產生器,沒有動態使用者輸入的概念。
對於內容,預設的 Markdown 渲染器被配置為移除或轉義潛在不安全的內容。如果您信任您的內容,可以重新配置此行為。