在Linux上,命令行程序mktemp比C函数mkstemp安全吗?

时间:2009-01-31 20:06:28

标签: c++ c linux temporary-files

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

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

正如您可以从mktemp(1)源代码中轻松看到的那样,除了调用mkstemp(3)之外,它基本上什么也没做。

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

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

答案 2 :(得分:0)

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

将一个人交给文件句柄会很困难。

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