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