2

这两个操作都创建一个空文件并返回文件名,但 mkstemp 使文件以独占模式打开并为您提供句柄。C 函数是否有安全优势?这是否意味着命令行版本存在安全漏洞?

顺便说一句,有趣的是,Linux 上的 C api 中有几个相关的函数,其中大多数在他们的手册页中说“不要使用这个函数”(或类似的)。

4

3 回答 3

8

在类 Unix 操作系统(包括 Linux 和 Mac OS)中使用临时文件的一个技巧是,一旦您打开文件,就将其删除。您仍然可以访问该文件,但没有其他人可以看到它或对其进行任何操作,并且一旦您关闭该文件,它就会消失,即使您的程序死于可怕的死亡。

于 2009-01-31T20:27:21.320 回答
3

mktemp(1)源代码中可以很容易地看到,它实际上除了调用mkstemp(3).

Linux 中的独占模式意味着如果文件已经存在,函数将失败,它不保证锁定。其他进程可以删除此文件,再次创建它并用数据填充它,尽管文件句柄open(3)由您的进程处理。

与命令行实用程序相比,C 函数没有额外的安全性。

于 2009-01-31T20:19:39.590 回答
0

系统调用和命令行函数最明显的区别在于,命令行函数是由人或他们的 shell 脚本使用的,而系统调用总是由程序完成的。

给一个人一个文件句柄是相当困难的。

关于“安全”,您应该考虑竞争条件:一个程序的多个实例同时调用 mkstemp,但每个实例都保证有一个唯一的临时文件。如果程序脱壳并调用命令行版本,几乎不可能保证这一点。

于 2009-01-31T20:15:37.350 回答