1. 附加功能
  2. 文件访问

安全与文件访问

与他人分享你的Gradio应用(通过在Spaces上托管、在你自己的服务器上托管或通过临时分享链接)暴露了你机器上的某些文件到互联网上。

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

Gradio 允许用户访问的文件

  • 通过gr.set_static_paths函数显式设置的静态文件。此参数允许您传入一个目录或文件名的列表,这些目录或文件将被视为静态文件。这意味着它们不会被复制到缓存中,而是直接从您的计算机提供。这可以帮助节省磁盘空间并减少应用程序启动所需的时间,但请注意可能的安全隐患。(默认情况下,此参数为空列表)。
  • launch() 中的 allowed_paths 参数中的文件。此参数允许您传入一个额外的目录或确切文件路径的列表,您希望允许用户访问这些路径。(默认情况下,此参数为空列表)。

  • 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.Imagegr.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