tmpnam警告说它很危险

时间:2010-07-21 13:44:35

标签: c++ temporary-files

我得到这个警告说tmpnam很危险,但我更喜欢使用它,因为它可以在Windows和Linux中使用。我想知道为什么它会被认为是危险的(我猜它是因为有可能被误用而不是它实际上没有正常工作)。

5 个答案:

答案 0 :(得分:26)

来自tmpnam手册页:

  

tmpnam()函数每次调用时都会生成一个不同的字符串,最多可达TMP_MAX次。如果调用的次数超过TMP_MAX次,则行为是实现定义的。

     

尽管tmpnam()生成难以猜测的名称,但是在tmpnam()返回路径名的时间和程序打开它的时间之间,另一个程序可能会使用open创建该路径名(2) ),或将其创建为符号链接。这可能导致安全漏洞。要避免这种可能性,请使用open(2)O_EXCL标志打开路径名。或者更好的是,使用mkstemp(3)或tmpfile(3)。

Mktemp确实创建了这个文件,所以你确信它有效,而tmpnam返回一个名字,可能已经存在了。

答案 1 :(得分:3)

如果要在多个平台上使用相同的符号,请使用宏来定义TMPNAM。只要您使用相同的界面选择更安全的功能,您就可以在两者上使用它。无论如何,你的代码中都有条件编译,对吧?

答案 2 :(得分:1)

来自tmpnam(3)联机帮助页:

  

尽管tmpnam()生成难以猜测的名称,但它可能在时间之间   tmpnam()返回一个路径名,程序打开它的时间,另一个程序可能会创建该路径 -   使用open(2)命名,或将其创建为符号链接。这可能导致安全漏洞。为避免这种可能性 -   绑定,使用open(2)O_EXCL标志打开路径名。或者更好的是,使用mkstemp(3)或tmpfile(3)。

答案 3 :(得分:1)

如果你谈到MSVC的编译器警告:

 These functions are deprecated because more secure versions are available;
 see tmpnam_s, _wtmpnam_s.

http://msdn.microsoft.com/de-de/library/hs3e7355(VS.80).aspx

否则只需阅读联机帮助文件中有关此功能缺点的内容。它主要是关于第二个进程创建与您的进程完全相同的文件名。

答案 4 :(得分:0)

该函数很危险,因为您负责分配一个足够大的缓冲区来处理tmpnam()将写入该缓冲区的字符串。如果你分配的缓冲区太小,tmpnam()无法知道,并且会超出缓冲区(导致破坏)。 tmpnam_s()(MS的安全版本)要求您传递缓冲区的长度,以便tmpnam_s知道何时停止。