Gradio Agent 和 MCP 黑客马拉松

获奖者
Gradio logo
  1. 附加功能
  2. 文件访问

安全与文件访问

将 Gradio 应用分享给他人(通过在 Spaces、自己的服务器上托管或通过临时共享链接)**会向**互联网**暴露**您机器上的某些文件。暴露的文件可以通过一个特殊的 URL 进行访问

http://<your-gradio-app-url>/gradio_api/file=<local-file-path>

本指南解释了哪些文件会被暴露,以及确保您机器上文件安全的一些最佳实践。

Gradio 允许用户访问的文件

  • 1. 静态文件。您可以使用 gr.set_static_paths 函数指定静态文件或目录。静态文件不会被复制到 Gradio 缓存(见下文),而是直接从您的计算机提供。这有助于节省磁盘空间并减少应用程序启动时间,但请注意可能的安全隐患,因为任何静态文件都可供 Gradio 应用的所有用户访问。

  • 2. launch()allowed_paths 参数中的文件。此参数允许您传入一个附加目录或精确文件路径的列表,以允许用户访问。(默认情况下,此参数为空列表)。

  • 3. Gradio 缓存中的文件。在您启动 Gradio 应用后,Gradio 会将某些文件复制到一个临时缓存中,并使这些文件可供用户访问。下面我们来详细探讨这一点。

Gradio 缓存

首先,了解 Gradio 为何有缓存非常重要。Gradio 在将文件返回到前端之前,会将文件复制到缓存目录。这可以防止文件在应用程序的另一个用户仍需要时被一个用户覆盖。例如,如果您的预测函数返回一个视频文件,那么 Gradio 在您的预测函数运行后会将该视频移动到缓存中,并返回一个前端可用于显示视频的 URL。缓存中的任何文件都可以通过 URL 提供给您运行中的应用程序的所有用户。

提示: 您可以通过将 `GRADIO_TEMP_DIR` 环境变量设置为绝对路径(例如 `/home/usr/scripts/project/temp/`)来定制缓存的位置。

Gradio 移动到缓存的文件

Gradio 将三类文件移入缓存

  1. 开发者在运行时前指定的文件,例如缓存的示例、组件的默认值,或传递给 gr.Chatbotavatar_images 等参数的文件

  2. 如果您的 Gradio 应用程序中的预测函数返回的文件路径**也**满足以下条件之一

  • 它位于 Blocks.launch 方法的 allowed_paths 参数中。
  • 它位于 Python 解释器的当前工作目录中。
  • 它位于通过 tempfile.gettempdir() 获取的临时目录中。

注意:当前工作目录中名称以句点(.)开头的文件即使是从预测函数返回,也不会被移动到缓存中,因为它们通常包含敏感信息。

如果不满足这些条件,返回该文件的预测函数将抛出异常,而不是将文件移动到缓存中。Gradio 执行此检查是为了防止任意文件在您的机器上被访问。

  1. 用户上传到您的 Gradio 应用的文件(例如通过 FileImage 输入组件)。

    提示: 如果 Gradio 阻止了您希望它处理的任何文件,请将其路径添加到 `allowed_paths` 参数中。

Gradio 不允许其他人访问的文件

运行时,Gradio 应用将**不允许**用户访问

  • 您通过 launch() 函数中的 blocked_paths 参数明确阻止的文件。您可以向 launch() 函数的 blocked_paths 参数传入一个附加目录或精确文件路径的列表。此参数优先于 Gradio 默认暴露的文件,或 allowed_paths 参数或 gr.set_static_paths 函数指定的文件。

  • 主机上的任何其他路径。用户不应能够访问主机上的其他任意路径。

上传文件

共享您的 Gradio 应用程序还将允许用户上传文件到您的计算机或服务器。您可以设置上传文件的最大大小,以防止滥用并节省磁盘空间。您可以通过 .launchmax_file_size 参数来设置。例如,以下两个代码片段将每个文件的上传大小限制为 5 兆字节。

import gradio as gr

demo = gr.Interface(lambda x: x, "image", "image")

demo.launch(max_file_size="5mb")
# or
demo.launch(max_file_size=5 * gr.FileSize.MB)

最佳实践

  • 为您的应用程序设置 max_file_size
  • 不要从连接到基于文件的输出组件(gr.Image, gr.File 等)的函数中返回任意用户输入。例如,以下界面将允许任何人将本地目录中的任意文件移动到缓存中:gr.Interface(lambda s: s, "text", "file")。这是因为用户输入被视为任意文件路径。
  • 尽量减小 allowed_paths 的范围。如果 allowed_paths 中的路径是一个目录,则该目录中的任何文件都可以被访问。请确保 allowed_paths 中的条目仅包含与您的应用程序相关的文件。
  • 从应用程序文件所在的目录运行 Gradio 应用程序。这将缩小 Gradio 允许移动到缓存中的文件范围。例如,优先使用 python app.py 而不是 python Users/sources/project/app.py

示例:访问本地文件

gr.set_static_paths 和 launch 中的 allowed_paths 参数都期望使用绝对路径。下面是一个在 HTML 块中显示本地 .png 图像文件的最小示例。

├── assets
│   └── logo.png
└── app.py

对于示例目录结构,在 app.py 中的 Gradio 应用可以按如下方式访问 assets 文件夹中的 logo.png 和任何其他文件

from pathlib import Path

import gradio as gr

gr.set_static_paths(paths=[Path.cwd().absolute()/"assets"])

with gr.Blocks() as demo:
    gr.HTML("<img src='/gradio_api/file=assets/logo.png'>")

demo.launch()