Hugo安全模型
运行时安全
Hugo生成静态输出,因此构建完成后,运行时即为浏览器(假设输出为HTML)和与之集成的任何服务器(API)。
但在开发和构建站点时,运行时是“hugo”可执行文件。保护运行时可能是一个真正的挑战。
Hugo的主要方法是使用沙盒和严格的默认安全策略:
- Hugo拥有虚拟文件系统,只允许主项目(而不是第三方组件)挂载项目根目录之外的目录或文件。
- 只有主项目可以遍历符号链接。
- 用户定义的组件对文件系统具有只读访问权限。
- 我们通过调用一些外部二进制文件来支持Asciidoctor等功能,但这些二进制文件及其标志是预定义的,并且默认情况下被禁用(请参见安全策略)。关于运行任意外部操作系统命令的通用函数已经进行了 讨论,但由于安全问题,尚未实现。
安全策略
Hugo有一个内置的安全策略,限制了对os/exec、远程通信和类似功能的访问。
默认配置如下。如果使用了安全策略中未包含的功能构建,则将失败并显示详细信息,指出需要执行的操作。这些设置大多是允许列表(字符串或切片,正则表达式或none
表示不匹配任何内容)。
security:
enableInlineShortcodes: false
exec:
allow:
- ^(dart-)?sass(-embedded)?$
- ^go$
- ^npx$
- ^postcss$
osEnv:
- (?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG)$
funcs:
getenv:
- ^HUGO_
- ^CI$
goTemplates:
allowActionJSTmpl: false
http:
mediaTypes: null
methods:
- (?i)GET|POST
urls:
- .*
[security]
enableInlineShortcodes = false
[security.exec]
allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^npx$', '^postcss$']
osEnv = ['(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG)$']
[security.funcs]
getenv = ['^HUGO_', '^CI$']
[security.goTemplates]
allowActionJSTmpl = false
[security.http]
methods = ['(?i)GET|POST']
urls = ['.*']
{
"security": {
"enableInlineShortcodes": false,
"exec": {
"allow": [
"^(dart-)?sass(-embedded)?$",
"^go$",
"^npx$",
"^postcss$"
],
"osEnv": [
"(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG)$"
]
},
"funcs": {
"getenv": [
"^HUGO_",
"^CI$"
]
},
"goTemplates": {
"allowActionJSTmpl": false
},
"http": {
"mediaTypes": null,
"methods": [
"(?i)GET|POST"
],
"urls": [
".*"
]
}
}
}
请注意,Hugo中的这些和其他配置设置可以被操作系统环境覆盖。如果要阻止所有远程HTTP数据提取:
HUGO_SECURITY_HTTP_URLS=none hugo
依赖项安全
Hugo使用Go Modules构建静态二进制文件来管理其依赖关系。Go模块具有多重保护措施,其中之一就是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渲染器已经被配置为删除或转义可能不安全的内容。如果信任您的内容,可以重新配置此行为。