在二月发布的 Discourse 2.4 版本 中新增了“安全上传”功能,该功能为 Discourse 实例内的所有上传文件(图片、视频、音频、文本、PDF、ZIP 等)提供更高程度的安全性。
前提条件
您的网站必须已启用 S3 上传,并且需要填写以下设置:
- S3 访问密钥 ID (Access Key ID)
- S3 秘密访问密钥 (Secret Access Key)
- S3 区域 (Region)
- S3 上传存储桶 (Upload Bucket)
此外,您必须使用一个没有公共存储桶策略的 S3 存储桶,并确保所有现有上传文件的 S3 ACL 均为 public-read。请参阅下方的“启用安全上传”部分。
满足这些前提条件后,您可以启用“安全上传”站点设置。
启用安全上传
此处有龙 (HERE BE DRAGONS)
![]()
这是一个高级功能,除企业版 (Enterprise tier) 外,我们的支持将非常有限。仅当您是专家用户时才启用安全上传。
要启用安全上传,请遵循以下步骤:
- 确保已配置 S3 上传。
- 确认您的 S3 存储桶是否具有公共存储桶策略。如果是,则需要额外的步骤(步骤 4)。
- 运行
uploads:sync_s3_aclsrake 任务。这将确保您所有的上传文件在 S3 中具有正确的 ACL。这非常重要;如果您在步骤 4 之前执行此操作,某些上传文件可能会在您的论坛上无法访问。 - 如果步骤 1 中存在公共存储桶策略,请将其从存储桶中移除。
- 启用“安全上传”站点设置。可选地启用“阻止匿名用户下载文件”站点设置,以阻止匿名用户从公开帖子中下载附件。从此时起的所有上传,根据以下条件可能会被标记为安全。
- 如果您希望所有历史上传文件都被分析并可能标记为安全,请运行
uploads:secure_upload_analyse_and_updaterake 任务。
关于 S3 存储桶策略的说明 
您需要确保正在上传的存储桶不具有公共存储桶策略。公共存储桶策略的内容类似于:
{
"Version": "2012-10-17",
"Id": "ComputedBucketPolicy",
"Statement": [
{
"Sid": "AllowWorldRead",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
这里的关键部分是允许 * 执行 GetObject 操作,这意味着允许任何人下载存储桶中的任何内容。如果策略是公共的,也会显示此标签:
此处不应修改这些设置。下图展示了“阻止公共访问”选项卡的理想状态:
功能说明
启用安全上传后,通过编辑器 (Composer) 上传的任何文件都将被标记为安全或不安全,具体取决于以下标准:
- 如果您启用了“需要登录”站点设置,所有上传文件都将被标记为安全,匿名用户将无法访问。
- 如果您在私人消息 (Personal Message) 中上传内容,该内容将被标记为安全。
- 如果您在属于私有分类 (Category) 的主题 (Topic) 中上传内容,该内容将被标记为安全。
S3 上的上传文件将具有私有 ACL,因此直接链接到 S3 上的文件将返回 403 访问被拒绝错误。对安全上传的所有访问都将通过 S3 预签名 URL 进行。这对用户是隐藏的;如果上传是安全的,任何对它的引用都将通过 Discourse 的 /secure-uploads/ URL 进行。
权限和访问控制
/secure-uploads/ URL 将确定当前用户是否被允许访问该媒体,并在允许时提供访问。创建上传时,该上传首次出现的帖子将被设置为“访问控制帖子”,所有权限都将基于该帖子。
- 如果您启用了“需要登录”站点设置,匿名用户访问该 URL 时始终会收到 404 错误。
- 如果访问的媒体其访问控制帖子是私人消息,则用户必须是该私人消息主题的一部分才能访问该媒体,否则用户将收到 403 错误。
- 如果访问的媒体其访问控制帖子位于私有分类的主题内,则用户必须有权访问该分类才能访问该媒体,否则用户将收到 403 错误。
在不同的帖子和主题之间复制 /secure-uploads/ URL 是不明智的,因为不同用户在您的 Discourse 论坛中拥有不同的访问级别。新上传应始终通过编辑器 (Composer) 创建。Oneboxes 和热链接图片也将遵守安全上传规则。站点设置上传、表情符号和主题上传不受安全上传影响,因为它们必须是公开的。
如果删除了访问控制帖子,附加的上传文件将无法再被访问。 ![]()
移动带有安全上传的帖子
如果您将“访问控制帖子”在不同的安全上下文之间移动,则附加的上传文件可能会变为安全或不安全。以下情况可能会更改上传文件的安全性:
- 更改主题分类。将遍历主题中的所有帖子,并相应地更新上传文件的安全状态。
- 将主题在公开主题和私人消息之间切换。将执行与上述相同的操作。
- 将帖子从主题移动到新主题或现有其他主题。将在目标主题上执行与上述相同的操作。
邮件中的安全上传
默认情况下,在邮件中嵌入安全图片已启用。您可以配置以下站点设置以进行更细粒度的控制:
secure_uploads_allow_embed_images_in_emails:禁用此项以在邮件中屏蔽安全图片。secure_uploads_max_email_embed_image_size_kb:嵌入安全图片的大小上限,默认为 1MB,以防止邮件过大。最大值为 10MB。与email_total_attachment_size_limit_kb配合使用。
安全图片将作为邮件附件添加,并使用 cid: URL 格式嵌入,因为电子邮件客户端对 base64 URL 的支持仍然不稳定。
如果您未启用 secure_uploads_allow_embed_images_in_emails,或者图片开始超过大小限制,那么您将看到以下内容来代替安全图片(同样适用于未嵌入的安全音频和视频):
![]()
托管客户
目前,安全上传功能仅对我们的企业版 (Enterprise plan) 客户开放。如需更多详情,请 联系我们。


ADVANCED thing, not for the faint of
, and there is a limit to how much we will support it outside our enterprise tier. Bring your own expertise…
