gpt4 book ai didi

c - 防止删除一组文件的例程具有破坏性

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:44 26 4
gpt4 key购买 nike

以下是我编写的程序的一小段摘录。该例程通过 filenamelist(权限 0600),其中包含存储在 directory 中的行分隔文件名列表(如 FileOne\nAnotherFile\nThird file\n),文件扩展名为 EXTENSION。文件名列表来 self 程序的另一部分。

我有点担心 filenamelist 会被滥用来删除系统上的其他文件。有没有更好的方法来锁定它?最初我存储了要删除的文件的完整路径,但后来分离并硬编码目录和文件扩展名以试图混淆它。

我可能有点偏执,但恶意用户 (!) 可能会以某种方式用其他文件路径毒化 filenamelist。例如 ../../another-directory/donotdeleteme.sys 或以我什至无法想到的方式转义它。

那么下面的删除例程是否会被滥用来删除目录之外的文件?关于如何进一步锁定它以防止 cat·astrophe 的任何建议?

PS:该程序必须以 root 身份运行,因为它的一部分操作是修改用户主目录之外的文件。

#define EXTENSION ".stuff"
char *directory = calloc( 28 );
directory = "/usr/local/share/stuffings/";
char *filenamelist = calloc( 24 );
filenamelist = "/etc/stuffing/files.lst";

void delete_files( char* filenamelist, char* directory ) {

if ( access( filenamelist, F_OK | R_OK ) == 0 ) {
FILE *filenamelist_fp = fopen( filenamelist, "r" );
char filename[200];

while( fgets( filename, 200, filenamelist_fp ) != NULL ) {
char *pos;
char *path = calloc( ( strlen( directory ) + strlen( filename ) + strlen( EXTENSION ) + 1 ), sizeof( char ) );

if ( ( pos=strchr( filename, '\n' ) ) != NULL )
*pos = '\0';

strcat( path, directory );
strcat( path, filename );
strcat( path, EXTENSION );

if ( access( path, F_OK | W_OK ) == 0 )
unlink( path );
free( path );
}

fclose( filenamelist_fp );
unlink( filenamelist );
}
} /* © */

最佳答案

如果您添加检查以确保文件名中没有嵌入 / 字符,那么您将完全安全地避免删除给定目录之外的文件(假设是 POSIX 平台)。不幸的是,这也将阻止删除给定目录下子目录中的文件。如果这没问题,那么您可以使用该解决方案。

如果您需要支持删除给定目录的子目录内的文件,那么第一步是阻止 .. 作为路径名的任何组成部分出现,但这还不够:您需要小心指向给定目录下任何位置的目录的符号链接(symbolic link),因为跟随它们可能会导致删除树外的文件。在这种情况下,最可靠的解决方案可能是自己解析路径名的每个组件,使用 openat 手动打开每个目录组件(比较 fstatlstat 的结果 以确保您没有遵循符号链接(symbolic link)),并在末尾使用 unlinkat 删除文件。

顺便说一下,您对 access( filenamelist, F_OK | R_OK) 的调用是多余且不必要的。在打开文件之前测试对文件的访问是没有意义的。您也可以只fopen() 文件。

关于c - 防止删除一组文件的例程具有破坏性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14060105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com