[Feature] Centralized Upload Validation (Extension Blacklist & Filename Security)

用户在使用 Gradio 框架(版本未知)开发 WebUI 应用时,当用户上传文件名为 Windows 保留设备名(例如 CON.txt 、 PRN.jpg 等)时,文件上传操作会在后端失败。此问题仅在 Windows 主机上触发,因为 Windows 文件系统禁止创建这些命名的文件。

[Feature] Centralized Upload Validation (Extension Blacklist & Filename Security)

[Feature] Centralized Upload Validation (Extension Blacklist & Filename Security)

快速结论:该 Issue 讨论的是 Gradio 文件上传过程中的安全增强提案,并非一个具体报错。核心关注点是:当前 strip_invalid_filename_characters() 函数未能过滤 Windows 保留设备名(如 CON, PRN),导致在 Windows 主机上文件上传失败。优先排查:确认服务器是否为 Windows 系统,并检查上传文件名是否包含 CONPRN 等保留名。

问题场景

用户在使用 Gradio 框架(版本未知)开发 WebUI 应用时,当用户上传文件名为 Windows 保留设备名(例如 CON.txtPRN.jpg 等)时,文件上传操作会在后端失败。此问题仅在 Windows 主机上触发,因为 Windows 文件系统禁止创建这些命名的文件。

报错原文

# 非直接报错,而是上传操作因 Windows 文件系统限制而失败
# 具体表现:Gradio 在尝试将临时文件移动到目标路径(包含 CON.txt 等)时失败
# 引发 HTTP 错误或后端异常

原因分析

可能原因:当前 strip_invalid_filename_characters() 函数虽然能过滤大部分不安全字符,但未处理 Windows 保留设备名。当用户上传文件名为 CONPRNAUXNULCOM1COM9LPT1LPT9(不区分大小写,带或不带扩展名,如 con.jpg)时,该函数会原样返回。随后在 route_utils.pyupload_fn() 中,路径拼接后仍包含该保留名,导致在 Windows 上文件写入失败。

环境排查

  • 确认服务器操作系统是否为 Windows(开发者或用户端)。
  • 确认 Gradio 版本(Issue 关闭于 2026-07-22,建议检查该日期前后的版本)。
  • 查看 gradio/utils.py 中的 strip_invalid_filename_characters() 函数实现,确认是否已包含 Windows 保留名检查。

解决步骤

  1. 检查 gradio/utils.py 中的 strip_invalid_filename_characters() 函数,确认其是否已对 Windows 保留设备名进行拦截。
  2. 可优先尝试(基于 Issue 中的建议):在该函数末尾添加如下逻辑:获取文件名的主干部分(不带扩展名),将其转为大写后,检查是否在 WINDOWS_RESERVED_NAMES 列表(包含 CON, PRN, AUX, NUL, COM1–COM9, LPT1–LPT9)中。若命中,则在文件名前添加下划线 _ 前缀,例如将 CON.txt 改为 _CON.txt
  3. 此修改属于非破坏性变更,不会影响已存在的有效文件名(如 .env-rf)。

验证方法

在 Windows 主机上创建一个 Gradio 应用并尝试上传文件名为 CON.txtPRN.jpg 的文件。若正常上传且文件成功保存(文件名变为 _CON.txt_PRN.jpg),则问题已解决。

参考来源

gradio-app/gradio #13443

celebrityanime
celebrityanime
文章: 14750

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注