使用mkstemp()生成临时文件名时,可以安全地立即调用mkstemp()返回的文件描述符上的close(),将mkstemp()生成的文件名存储在某处并使用它(在很晚的时候)再次打开文件写一个临时文件?或者,一旦我调用close(),这个临时文件名是否会再次可用?
我问的原因是我想知道为什么mkstemp()会返回一个文件描述符.如果立即关闭()描述符是安全的,为什么它会返回一个描述符呢?mkstemp()可以自己关闭它,只给我一个文件名.
在您用于mkstemp()创建文件的时间和重新打开文件的时间之间,您的对手可能已删除您创建的文件,并将符号链接放在指向其他位置的位置.这是一个TOCTOU - 检查时间,使用时间 - mkstemp()如果您保持文件描述符打开,则使用的漏洞很大程度上避免了.
关闭文件描述符后,所有投注都将在充满敌意的环境中关闭.
请注意,即使您保持文件描述符处于打开状态,攻击者也可能会删除该文件,或重命名该文件,然后在其位置创建自己的文件(符号链接,目录).文件描述符仍然有效.您可以使用stat()获取名称信息和fstat()获取文件描述符信息,如果两者匹配(st_dev和st_ino字段),那么您可能仍然可以.如果它们不同,有人会找到该文件 - 如果您重命名它,您可能正在重命名其文件而不是您创建的文件.
虽然最初创建的文件mkstemp()仍然存在,但不会重新生成名称.通常,连续调用mkstemp()将创建不同的名称,但保证名称在创建时是唯一的(请参阅O_EXCL标记open()).
并且万一你想知道,不 - 没有办法将名称与文件描述符相关联(没有假设的int flink(int fd, const char *name)系统调用).不久前在Stack Exchange网站上有一个问题,答案肯定是否定的,引用了Linux Kernel邮件列表等等.其中一个问题是,是否可以从打开的文件描述符中重新创建文件?,但我认为这个问题还有一个更彻底的版本.