安全模型
运行时安全
Hugo 生成静态输出,因此一旦构建完成,运行时就是浏览器(假设输出为 HTML)以及您集成的任何服务器(API)。
但在开发和构建您的站点时,运行时是 hugo
可执行文件。保护运行时可能是一个 真正的挑战 。
Hugo 的主要方法是沙盒和具有严格默认值的安全性策略:
- Hugo 具有虚拟文件系统,只有主项目(而不是第三方组件)才能挂载项目根目录之外的目录或文件。
- 用户定义的组件对文件系统只有只读访问权限。
- 我们调用一些外部二进制文件来支持 Asciidoctor 等,但这些二进制文件及其标志是预定义的,默认情况下是禁用的(参见 安全策略 )。运行任意外部操作系统命令的通用函数已被 讨论 ,但由于安全问题而未实现。
安全策略
Hugo 具有内置的安全策略,该策略限制对 os/exec 、远程通信等的访问。
默认配置如下所示。任何使用安全策略允许列表中未列出的功能的构建都将失败,并显示有关需要执行的操作的详细消息。这些设置中的大多数都是允许列表(字符串或切片, 正则表达式 或 none
,它不匹配任何内容)。
security:
enableInlineShortcodes: false
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)$
funcs:
getenv:
- ^HUGO_
- ^CI$
http:
mediaTypes: null
methods:
- (?i)GET|POST
urls:
- .*
[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 = ['.*']
{
"security": {
"enableInlineShortcodes": false,
"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)$"
]
},
"funcs": {
"getenv": [
"^HUGO_",
"^CI$"
]
},
"http": {
"mediaTypes": null,
"methods": [
"(?i)GET|POST"
],
"urls": [
".*"
]
}
}
}
默认情况下,Hugo 允许 resources.GetRemote
函数下载媒体类型对应于内部允许列表的文件。要向允许列表添加媒体类型:
security:
http:
mediaTypes:
- ^image/avif$
[security]
[security.http]
mediaTypes = ['^image/avif$']
{
"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
简而言之:
模板和配置作者(您)是可信的,但您发送的数据不可信。
这就是为什么您有时需要使用 安全 函数(例如 safeHTML
)来避免对您知道是安全的数据进行转义。
如文档中所述,上述内容有一个例外:如果您启用内联短代码,您也表示短代码和内容文件中的数据处理是可信的,因为这些宏被视为纯文本。
值得补充的是,Hugo 是一个静态站点生成器,没有动态用户输入的概念。
对于内容,默认 Markdown 渲染器 配置 为删除或转义潜在的不安全内容。如果您信任您的内容,可以重新配置此行为。