确保文件为(X级)的有效方法?在某个目录下

Efficient way to make sure file is (X levels)? under a certain directory

本文关键字:方法 有效 文件 确保      更新时间:2023-10-16

我需要确保某个文件在某个目录中(无论级别多少)。

可视化:

A/ + file

A/ + x/x/x/..../file

它必须在A以下,不管有多少级别。

文件路径(在加号之后)由用户指定给程序。

问题是我不能使用chroot,因为程序还需要访问A之外的一些文件夹(比如说B),但用户(通过套接字接口连接)不应该能够通过A/ + ../B/file 访问它们

这将在内部内环中完成,因此它必须表现良好。我曾想过计算"/",提取".."的个数,正在提取编号"/./"并将其比较为>=1,但由于输入是由用户提供的,因此它既表现不佳,又容易出现错误。

有没有一个我不知道或其他方式的函数可以检查这个?

编辑:

如果有一种方法可以允许我访问B文件夹,即使在我chroot之后(如果我没记错的话,文件句柄仍保留在chroot之后,我需要它的文件夹版本),那也没关系。我只需要访问B

第2版:

顺便说一句,我知道使用UID之类的方法,但我需要一个替代方案。

我认为最简单的方法是将用户提供的路径字符串附加到A目录的路径末尾,然后使用POSIX realpath()函数来简化生成的路径字符串。(realpath()将消除任何".."或符号链接的恶作剧,并为您提供一个简单、绝对的文件路径字符串)

然后将该路径与A目录的简化/绝对路径进行比较。如果文件路径字符串以A的路径字符串开头(例如strncmp(file_path_str,A_dir_path_str,strlen(A_dir_path _str))==0),则允许访问该文件;否则拒绝访问。

您可以在递归函数中调用ftw()nftw()

在执行此操作时,您需要确保不遵循符号链接或将遍历限制为符号链接。

初始启动可以扫描频繁访问的文件夹以进行存储,直到接收到请求并且系统空闲。所有请求都被添加到存储(哈希表等)中

你可以在这里找到详细信息。

假设"用户"没有对系统的自由访问权限,但本身有足够的权限,我希望chroot是您正在寻找的解决方案。

因此,与其验证输入的目录结构,不如简单地更改"根",使其指向"A/"-然后(如果需要)从路径的开头删除"A/",并接受其余部分。