Hugo 安全模型
运行时安全
Hugo 生成静态网站,这意味着最终输出直接在浏览器中运行并与任何集成的 API 交互。但是,在开发和站点构建期间,hugo 可执行文件本身是运行时环境。
保护运行时是一项复杂的任务。Hugo 通过强大的沙盒方法和具有默认保护的严格安全策略来解决这个问题。主要功能包括:
- 虚拟文件系统:Hugo 采用虚拟文件系统,限制文件访问。只有主项目(而不是外部组件)可以访问项目根目录之外的文件或目录。
- 只读访问:用户定义的组件对文件系统具有只读访问权限,防止意外修改。
- 受控外部二进制文件:虽然 Hugo 利用外部二进制文件来实现 Asciidoctor 支持等功能,但这些二进制文件严格预定义,具有特定的标志,并且默认情况下是禁用的。安全策略 详细说明了这些限制。
- 无任意命令:为了降低风险,Hugo 有意避免实现允许用户执行任意操作系统命令的通用函数。
这种沙盒和严格默认值的组合有效地最小化了 Hugo 构建过程中潜在的安全漏洞。
依赖安全
Hugo 利用 Go 模块 来管理其依赖项,编译为静态二进制文件。Go 模块创建 go.sum 文件,这是一个关键的安全功能。此文件充当数据库,存储所有依赖项(包括间接需要的依赖项,即传递依赖项)的预期加密校验和。
Hugo 模块 扩展了 Go 模块的功能,也会生成 go.sum 文件。为确保依赖项完整性,请将此 go.sum 文件提交到您的版本控制中。如果 Hugo 在构建过程中检测到校验和不匹配,它将失败,表明可能试图 篡改项目的依赖项。
Web 应用程序安全
Hugo 的安全理念植根于既定的安全标准,主要与 OWASP 定义的威胁保持一致。对于 HTML 输出,Hugo 在明确的信任模型下运行。该模型假设模板和配置作者(开发人员)是值得信赖的。但是,提供给这些模板的数据本质上被视为不可信的。这种区别对于理解 Hugo 如何处理潜在的安全风险至关重要。
为了防止开发人员知道是安全的数据意外转义,Hugo 提供了 safe 函数,例如 safeHTML。这些函数允许开发人员明确将数据标记为可信的,绕过默认转义机制。这对于从可靠来源生成或获取数据的场景至关重要。但是,存在一个例外:启用 内联短代码。通过激活此功能,您隐式信任短代码内的逻辑和内容文件中包含的数据。
重要的是要记住 Hugo 是一个静态站点生成器。这种架构选择通过消除与动态用户输入相关的复杂性和漏洞来显著减少攻击面。与动态网站不同,Hugo 生成静态 HTML 文件,最小化实时攻击的风险。关于内容,Hugo 的默认 Markdown 渲染器 配置为清理 潜在的不安全内容。此默认行为确保删除或转义潜在的恶意代码或脚本。但是,如果您对内容来源的安全性有高度信心,可以重新配置此设置。
本质上,Hugo 通过在开发人员和数据之间建立明确的信任边界来优先考虑安全输出。默认情况下,它倾向于谨慎,清理潜在的不安全内容并转义数据。开发人员可以通过 safe 函数和 配置选项 灵活地调整这些默认值,但他们必须清楚地了解安全影响。Hugo 的静态站点生成模型通过最小化动态漏洞进一步加强了其安全态势。
配置
请参阅 配置安全。