以下是我编写的程序的一小段摘录。该例程通过filenamelist
(权限 0600),其中包含存储的行分隔文件名列表,这些文件名都存储在directory
(如FileOne\nAnotherFile\nThird file\n
)中,文件扩展名为EXTENSION
. 文件名列表来自我程序的另一部分。
我有点担心filenamelist
会被滥用来删除系统上的其他文件。有没有更好的锁定方法?最初我存储了要删除的文件的完整路径,但后来分离并硬编码了目录和文件扩展名以试图混淆它。
我可能是偏执狂,但恶意用户(!)可能会filenamelist
以某种方式毒害其他文件路径。例如../../another-directory/donotdeleteme.sys
或以某种我什至无法想到的方式逃避它。
那么下面的删除例程可以被滥用来删除外部文件directory
吗?关于如何进一步锁定它以防止 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 );
}
} /* © */