代码之家  ›  专栏  ›  技术社区  ›  Cenoc

tmpnam警告说这很危险

  •  25
  • Cenoc  · 技术社区  · 14 年前

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

    5 回复  |  直到 13 年前
        1
  •  28
  •   Remy Lebeau    11 年前

    从tmpnam手册页:

    函数的作用是:每次调用一个不同的字符串,最多生成TMP\u MAX次。如果调用次数超过TMP\u MAX次,则行为由实现定义。

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

        2
  •  3
  •   nmichaels    14 年前

        3
  •  1
  •   akira    14 年前

    如果您谈到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
  •  1
  •   sbi    14 年前

    从tmpnam(3)手册页:

    tmpnam()返回一个路径名,当程序打开它时,另一个程序可能会创建该路径 使用open(2)命名,或将其创建为符号链接。这会导致安全漏洞。为了避免这种可能性

        5
  •  0
  •   James Curran    14 年前

    这个函数很危险,因为您负责分配一个足够大的缓冲区来处理 tmpnam() 将写入缓冲区。如果分配的缓冲区太小, tmpnam() 无法知道这一点,并将溢出缓冲区(造成严重破坏)。 tmpnam_s() (MS的安全版本)要求您传递缓冲区的长度,因此 tmpnam_s