关于

安全模型

Hugo 的安全边界、运行时与依赖安全,以及模板信任模型。

安全边界

  • layouts 中的模板是可信的。
  • archetypes、assets、resources、data、i18n 和 static 中的资源是可信的。
  • content 中的内容,以及由内容适配器在 content 中生成的内容,是不可信的;唯一例外是启用内联短代码时。对于内容适配器,这一范围仅限于适配器的输出结果。
  • 开发服务器 hugo server 及其 livereload 脚本是可信的,仅用于本地开发。
  • Hugo 没有线上生产服务器;任何导致构建失败的畸形输入(例如格式错误的内容前置元数据)都不被定义为拒绝服务(DoS)。这也包括触发运行时错误的输入,例如 fatal error: stack overflow;这类问题请作为缺陷报告。

运行时安全

Hugo 生成的是静态网站:最终输出直接在浏览器中运行,并与所集成的各类 API 交互。但在开发和构建站点期间,hugo 可执行文件本身就是运行时环境。

保障运行时安全是一项复杂的任务。Hugo 通过稳健的沙箱方案和带默认保护的严格安全策略来应对,主要特性包括:

  • 虚拟文件系统:Hugo 使用虚拟文件系统限制文件访问。只有主项目(而非外部组件)可以访问项目根目录之外的文件或目录。
  • 只读访问:用户自定义组件对文件系统只有只读权限,防止意外修改。
  • 受控的外部二进制文件:Hugo 会为 Asciidoctor 支持等功能使用外部二进制文件,但这些文件经过严格预定义并带有特定参数,且默认禁用。安全策略中说明了这些限制。
  • 不执行任意命令:为降低风险,Hugo 有意不实现那些允许用户执行任意操作系统命令的通用函数。
  • 务实的默认值:默认安全策略旨在平衡安全性与可用性,让常见工作流开箱即用,同时把更敏感的能力留作显式启用。这些默认值可能在今后的版本中收紧,但每个项目最终有责任审阅策略,并按自身的信任模型与需求进行调整。

沙箱与严格默认值的这种组合,有效降低了 Hugo 构建过程中潜在的安全漏洞。

依赖安全

Hugo 使用 Go 模块管理依赖,并编译为静态二进制文件。Go 模块会生成 go.sum 文件,这是一项关键的安全特性:该文件像数据库一样,存储所有依赖(包括间接引入的传递依赖)的预期加密校验和。

扩展 Go 模块功能的 Hugo 模块同样会生成 go.sum 文件。为确保依赖完整性,请把这个 go.sum 文件提交到版本控制中。如果 Hugo 在构建过程中检测到校验和不匹配,构建就会失败,这表明可能存在篡改项目依赖的尝试。

Web 应用安全

Hugo 的安全理念植根于既有安全标准,主要对齐 OWASP 定义的威胁。对于 HTML 输出,Hugo 遵循明确的信任模型:假设模板与配置的作者(即开发者)可信,而提供给这些模板的数据则被视为不可信。这一区分对理解 Hugo 如何处理潜在安全风险至关重要。

为避免开发者确知安全的数据被意外转义,Hugo 提供 safe 系列函数,例如 safe.HTML。这些函数允许开发者显式把数据标记为可信,从而绕过默认的转义机制;当数据由可靠来源生成或取得时,这一点很重要。但存在一个例外:启用内联短代码后,您即隐含地信任了短代码中的逻辑,以及内容文件中包含的数据。

需要记住的是,Hugo 是静态站点生成器。这一架构选择消除了动态用户输入带来的复杂性与漏洞,从而显著缩小攻击面:与动态网站不同,Hugo 生成静态 HTML 文件,降低了实时攻击的风险。在内容方面,Hugo 默认的 Markdown 渲染器已配置为净化潜在不安全的内容,可移除或转义潜在恶意的代码或脚本;如果您对内容来源的安全性有很高信心,也可以重新配置这一设置。

本质上,Hugo 通过在开发者与数据之间建立清晰的信任边界来优先保证输出安全:默认情况下偏向谨慎,净化潜在不安全的内容并转义数据;开发者可以通过 safe 系列函数和配置设置调整这些默认行为,但必须清楚理解由此带来的安全影响。Hugo 的静态站点生成模式消除了动态漏洞,进一步强化了它的安全态势。

配置

上述安全策略集中在 security 配置分区中,例如外部二进制文件在何种条件下可以被调用。上游文档把详细设置放在 /configuration/security/ 页面;本站配置相关的入门内容见配置 Hugo。