安全地创建一个临时文件 - mkstemp
在我们处理一些敏感数据的时候,可能必须要临时存储在文件中,这个时候就需要创建临时文件;
在我们需要临时创建一些大量的中间数据,并且在程序结束时删除这些文件时,我们就需要创建临时文件是非常有用的;
在进行单元测试的时候,我们可能需要创建一些临时文件来存储测试数据,这个时候也需要创建临时文件;
在 C 语言中,有两个常用的函数可以用来创建临时文件:tmpnam
和 mkstemp
。
然而,tmpnam
不是很安全的,可以被预测,而 mkstemp
是一个更好的选择。
mkstemp
简介
mkstemp
是一个 C 标准库函数,用于创建一个唯一的临时文件。
它是 tmpnam
的安全替代品,可以避免 tmpnam
的安全漏洞,
mkstemp
会创建一个唯一的文件名,并返回一个文件描述符,以便在程序中使用。
这个文件名是通过修改传入的模板字符串来生成的,确保了文件名的唯一性;
同时,mkstemp
会确保创建的文件具有 0600 的权限(只有所有者具有读写权限,其他人无权限),不论 umask 如何设置,别人无法窥探。
mkstemp
的使用示例
在 C 语言中使用 mkstemp
的简短示例:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main() {
char temp_filename[] = "/tmp/HELLO.XXXXXX"; /// file template
int fd = mkstemp(temp_filename); // create and open the file safely
if (fd == -1) {
perror("Failed to create temporary file");
return 1;
}
printf("Temporary file created: %s\n", temp_filename);
/// Do some test
write(fd, "Hello, world!\n", 14);
close(fd);
// delete file if it is no longer needed
unlink(temp_filename);
return 0;
}
这个示例安全地创建了一个临时文件,向其中写入数据,然后通过关闭和删除文件来进行清理。
为什么 tmpnam
是危险的
tmpnam
函数是一个不安全的函数,不建议使用。
这里主要是生成的临时文件名是可预测的,很容易被攻击者利用;
另外在生成文件名和创建文件之间存在一个时间差,这可能导致竞态条件,使得攻击者有机会操纵文件操作;
同时,tmpnam
生成的文件名可能会受到进程默认文件创建权限和 umask 设置的影响,这可能导致文件权限比预期更宽松,允许未经授权的用户读取或修改临时文件。