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