我们可以在 C++23 中实现一个安全创建临时文件的工具吗?

问题描述 投票:0回答:1

阅读完对我自己的代码的回顾关于

boost::filesystem::unique_path
的答案、关于
unique_path
及其参考文献的另一个答案、关于
tmpnam
及其Linux手册页的文档,以及其他一些内容之后相关的事情,我的印象是,使用 C++23,我们拥有提供临时文件创建的安全实现所需的一切,只需使用 C++23 标准库。

我所说的“安全”是指不存在已知安全漏洞

tmpnam
boost::filesystem::unique_path
的实现。

例如,我们可以实现一个

class temp_file
,其构造函数将生成一个 128 位随机文件名,并以独占模式 (
std::filesystem::temp_directory_path()
) 打开位于
std::ios::noreplace
下的同名文件,其析构函数将关闭该文件并删除它,其
stream
成员函数将返回对打开文件的输入/输出流的引用。

这样的实现,假设它是正确的,是否可以被视为创建和使用临时文件的安全设施,或者我是否遗漏了一些重要的考虑因素,在这种情况下,这些考虑因素是什么?

c++ filesystems race-condition c++23
1个回答
0
投票

C++ 的文件系统 API 无法创建此操作的“安全”版本。

要拥有完全安全的版本,您需要能够将以下所有操作作为单个文件系统原子操作执行:

  1. 生成目录中未使用的名称。
  2. 创建一个具有该名称的文件。
  3. 以独占方式打开该文件。

标准库可以单独执行其中每一个操作,但漏洞来自于无法将整个序列作为单个原子进程执行。只要其他程序可以干预这些操作中的任何一个,漏洞就存在。而 C++ 没有机制来确保这种文件系统的原子性。

如果您想这样做,那么现在您必须使用特定于操作系统的库函数。

© www.soinside.com 2019 - 2024. All rights reserved.