这两个操作都创建一个空文件并返回文件名,但 mkstemp 使文件以独占模式打开并为您提供句柄。C 函数是否有安全优势?这是否意味着命令行版本存在安全漏洞?
顺便说一句,有趣的是,Linux 上的 C api 中有几个相关的函数,其中大多数在他们的手册页中说“不要使用这个函数”(或类似的)。
这两个操作都创建一个空文件并返回文件名,但 mkstemp 使文件以独占模式打开并为您提供句柄。C 函数是否有安全优势?这是否意味着命令行版本存在安全漏洞?
顺便说一句,有趣的是,Linux 上的 C api 中有几个相关的函数,其中大多数在他们的手册页中说“不要使用这个函数”(或类似的)。
在类 Unix 操作系统(包括 Linux 和 Mac OS)中使用临时文件的一个技巧是,一旦您打开文件,就将其删除。您仍然可以访问该文件,但没有其他人可以看到它或对其进行任何操作,并且一旦您关闭该文件,它就会消失,即使您的程序死于可怕的死亡。
从mktemp(1)
源代码中可以很容易地看到,它实际上除了调用mkstemp(3)
.
Linux 中的独占模式意味着如果文件已经存在,函数将失败,它不保证锁定。其他进程可以删除此文件,再次创建它并用数据填充它,尽管文件句柄open(3)
由您的进程处理。
与命令行实用程序相比,C 函数没有额外的安全性。
系统调用和命令行函数最明显的区别在于,命令行函数是由人或他们的 shell 脚本使用的,而系统调用总是由程序完成的。
给一个人一个文件句柄是相当困难的。
关于“安全”,您应该考虑竞争条件:一个程序的多个实例同时调用 mkstemp,但每个实例都保证有一个唯一的临时文件。如果程序脱壳并调用命令行版本,几乎不可能保证这一点。