Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 721 – 将 tarfile.data_filter 用于源代码分发提取

作者:
Petr Viktorin <encukou at gmail.com>
PEP 代理人:
Paul Moore <p.f.moore at gmail.com>
状态:
最终版
类型:
标准跟踪
主题:
打包
要求:
706
创建日期:
2023 年 7 月 12 日
Python 版本:
3.12
发布历史:
2023 年 7 月 4 日
决议:
2023 年 8 月 2 日

目录

重要

本 PEP 是一份历史文档。最新的规范性说明 源代码分发归档特性 保存在 PyPA 规范页面

×

有关如何提出更改的建议,请参阅PyPA 规范更新流程

摘要

提取源代码分发归档时,通常应使用在 PEP 706 中添加的 data 过滤器。我们澄清了细节,并为无法直接使用该过滤器的工具指定了行为。

动机

“源代码分发” sdist 定义为 tar 归档。

tar 格式旨在捕获类 Unix 文件的所有元数据。其中一些是危险的、源代码不需要的,和/或平台相关的。正如 PEP 706 中所解释的,当解压 tarball 时,应该总是限制允许的特性,或者明确赋予 tarball 完全控制权。

基本原理

对于源代码分发,PEP 706 中引入的 data 过滤器就足够了。它允许的特性比 gitzip(两者都常用于打包工作流)略多。

然而,并非所有工具都能使用 data 过滤器,因此本 PEP 明确规定了一组预期。目标是使 pip downloadsetuptools.archive_util.unpack_tarfile 的当前行为有效,但被认为过于危险而不能允许的情况除外。另一个考虑是对于非 Python 工具而言易于实现。

未打补丁的 Python 版本

在不带 tarfile 过滤器的 Python 上运行时,工具可以忽略本 PEP。

该功能已向后移植到 python.org 支持的所有 Python 版本。将其在第三方库中内嵌是很棘手的,我们不应强迫所有工具都这样做。这将把跟上安全更新的责任从工具转移到用户身上。

权限

常用工具(gitzip)不保留 Unix 权限(模式位)。告诉用户不要依赖 sdist 中的这些权限,并允许工具相对自由地处理它们,这似乎是公平的。

唯一的例外是 可执行 权限。我们建议但不要求工具保留它。考虑到脚本通常是平台特定的,可以说保持它们可执行是工具特定的行为。

请注意,虽然 git 保留了可执行性,但 zip(因此 wheel)本身不这样做。(可以将其编码在“外部属性”中,但 Python 的 ZipFile.extract 不遵守这一点。)

规范

以下内容将以新标题“源代码分发归档特性”的形式添加到 PyPA 源代码分发格式规范

由于按原样提取 tar 文件是危险的,并且结果是平台特定的,因此源代码分发的归档特性受到限制。

使用数据过滤器解包

提取源代码分发时,工具必须要么使用 tarfile.data_filter(例如 TarFile.extractall(..., filter='data')),要么遵循下面的“不使用数据过滤器解包”部分。

例外情况是,在没有 hasattr(tarfile, 'data_filter')PEP 706)的 Python 解释器上,通常使用该过滤器(直接或间接)的工具可以警告用户并忽略此规范。在这种情况下,可用性(例如完全信任归档)和安全性(例如拒绝解包)之间的权衡由工具决定。

不使用数据过滤器解包

不直接使用 data 过滤器的工具(例如出于向后兼容性、允许额外特性或不使用 Python)必须遵循本节。(在撰写本文时,data 过滤器也遵循本节,但将来可能会不同步。)

以下文件在 sdist 归档中无效。遇到此类条目时,工具应通知用户,不得解包该条目,并可以中止并失败。

  • 将被放置在目标目录之外的文件。
  • 指向目标目录之外的链接(符号链接或硬链接)。
  • 设备文件(包括管道)。

以下也无效。工具可以像上面一样处理它们,但不是必需的。

  • 文件名或链接目标中包含 .. 组件的文件。
  • 指向不属于归档文件的链接。

工具可以将链接(符号链接或硬链接)解包为普通文件,使用归档中的内容。

解压 sdist 归档时

  • 文件名中的前导斜杠必须被删除。(这现在是 tar 解包的标准行为。)
  • 对于每个 mode (Unix 权限) 位,工具必须
    • 分别使用平台对新文件/目录的默认设置,
    • 根据归档设置该位,或
    • 对于不可执行文件使用 rw-r--r-- (0o644) 的位,对于可执行文件和目录使用 rwxr-xr-x (0o755) 的位。
  • mode 位(setuid、setgid、sticky)必须被清除。
  • 建议保留用户 可执行 位。

进一步提示

鼓励工具作者考虑 tarfile 文档中“进一步验证的提示”如何适用于他们的工具。

向后兼容性

现有行为未指定,并由不同的工具以不同方式处理。本 PEP 明确了预期。

没有已知的向后不兼容情况,但某些项目可能确实依赖于未保证的细节。本 PEP 禁止了其中最危险的功能,其余功能则由工具特定。

安全隐患

推荐的 data 过滤器被认为对常见的漏洞是安全的,并且将来如果发现缺陷,它将是唯一的修改点。

明确的规范包括来自 data 过滤器的保护措施。

如何教授此内容

本 PEP 旨在针对打包工具的作者,他们应该对 PEP 和更新的打包规范感到满意。

参考实现

待定

被拒绝的想法

暂无。

未解决的问题

暂无。


来源:https://github.com/python/peps/blob/main/peps/pep-0721.rst

最后修改:2025-02-01 08:55:40 GMT