Gradio Agent 和 MCP 黑客马拉松
获奖者Gradio Agent 和 MCP 黑客马拉松
获奖者将 Gradio 应用分享给他人(通过在 Spaces、自己的服务器上托管或通过临时共享链接)**会向**互联网**暴露**您机器上的某些文件。暴露的文件可以通过一个特殊的 URL 进行访问
http://<your-gradio-app-url>/gradio_api/file=<local-file-path>
本指南解释了哪些文件会被暴露,以及确保您机器上文件安全的一些最佳实践。
1. 静态文件。您可以使用 gr.set_static_paths
函数指定静态文件或目录。静态文件不会被复制到 Gradio 缓存(见下文),而是直接从您的计算机提供。这有助于节省磁盘空间并减少应用程序启动时间,但请注意可能的安全隐患,因为任何静态文件都可供 Gradio 应用的所有用户访问。
2. launch()
中 allowed_paths
参数中的文件。此参数允许您传入一个附加目录或精确文件路径的列表,以允许用户访问。(默认情况下,此参数为空列表)。
3. Gradio 缓存中的文件。在您启动 Gradio 应用后,Gradio 会将某些文件复制到一个临时缓存中,并使这些文件可供用户访问。下面我们来详细探讨这一点。
首先,了解 Gradio 为何有缓存非常重要。Gradio 在将文件返回到前端之前,会将文件复制到缓存目录。这可以防止文件在应用程序的另一个用户仍需要时被一个用户覆盖。例如,如果您的预测函数返回一个视频文件,那么 Gradio 在您的预测函数运行后会将该视频移动到缓存中,并返回一个前端可用于显示视频的 URL。缓存中的任何文件都可以通过 URL 提供给您运行中的应用程序的所有用户。
提示: 您可以通过将 `GRADIO_TEMP_DIR` 环境变量设置为绝对路径(例如 `/home/usr/scripts/project/temp/`)来定制缓存的位置。
Gradio 将三类文件移入缓存
开发者在运行时前指定的文件,例如缓存的示例、组件的默认值,或传递给 gr.Chatbot
的 avatar_images
等参数的文件
如果您的 Gradio 应用程序中的预测函数返回的文件路径**也**满足以下条件之一
Blocks.launch
方法的 allowed_paths
参数中。tempfile.gettempdir()
获取的临时目录中。注意:当前工作目录中名称以句点(.
)开头的文件即使是从预测函数返回,也不会被移动到缓存中,因为它们通常包含敏感信息。
如果不满足这些条件,返回该文件的预测函数将抛出异常,而不是将文件移动到缓存中。Gradio 执行此检查是为了防止任意文件在您的机器上被访问。
File
或 Image
输入组件)。提示: 如果 Gradio 阻止了您希望它处理的任何文件,请将其路径添加到 `allowed_paths` 参数中。
运行时,Gradio 应用将**不允许**用户访问
您通过 launch()
函数中的 blocked_paths
参数明确阻止的文件。您可以向 launch()
函数的 blocked_paths
参数传入一个附加目录或精确文件路径的列表。此参数优先于 Gradio 默认暴露的文件,或 allowed_paths
参数或 gr.set_static_paths
函数指定的文件。
主机上的任何其他路径。用户不应能够访问主机上的其他任意路径。
共享您的 Gradio 应用程序还将允许用户上传文件到您的计算机或服务器。您可以设置上传文件的最大大小,以防止滥用并节省磁盘空间。您可以通过 .launch
的 max_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
中的条目仅包含与您的应用程序相关的文件。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()