安全模型
运行时安全
Hugo 生成静态输出,因此一旦构建完成,运行时就是浏览器(假设输出是 HTML)以及您集成的任何服务器 (API)。
但在开发和构建您的网站时,运行时是 hugo
可执行文件。保护运行时可能是一个 真正的挑战。
Hugo 的主要方法是沙箱化和具有严格默认值的安全策略
- Hugo 有一个虚拟文件系统,只允许主项目(而不是第三方组件)挂载项目根目录之外的目录或文件。
- 用户定义的组件对文件系统具有只读访问权限。
- 我们会调用一些外部二进制文件来支持 Asciidoctor 和类似的文件,但这些二进制文件及其标志是预定义的,并且默认情况下处于禁用状态(请参阅安全策略)。运行任意外部 OS 命令的通用函数已被 讨论,但由于安全问题而未实现。
安全策略
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 中的这些和其他配置设置可以被 OS 环境覆盖。例如,如果您想阻止所有远程 HTTP 数据获取
HUGO_SECURITY_HTTP_URLS=none hugo
依赖项安全
Hugo 使用 Go 模块构建为静态二进制文件来管理其依赖项。Go 模块有几个安全措施,其中之一是 go.sum
文件。这是一个包含所有依赖项(包括传递依赖项)的预期加密校验和的数据库。
Hugo 模块是一个构建在 Go 模块功能之上的功能。与 Go 模块一样,使用 Hugo 模块的 Hugo 项目将有一个 go.sum
文件。我们建议您将此文件提交到您的版本控制系统。如果校验和不匹配,Hugo 构建将会失败,这表明存在 依赖项篡改。
Web 应用程序安全
这些是 OWASP 定义的安全威胁。
对于 HTML 输出,这是核心安全模型
https://pkg.go.dev/html/template#hdr-Security_Model
简而言之
模板和配置作者(您)是受信任的,但您发送的数据不受信任。这就是为什么您有时需要使用安全函数(例如 safeHTML
)来避免转义您知道是安全的数据。如文档中所述,上述情况有一个例外:如果您启用内联短代码,您还可以说内容文件中的短代码和数据处理是受信任的,因为这些宏被视为纯文本。值得补充的是,Hugo 是一个静态站点生成器,没有动态用户输入的概念。
对于内容,默认的 Markdown 渲染器被配置为删除或转义潜在不安全的内容。如果您信任您的内容,则可以重新配置此行为。