2

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

可视化:

A/ + file

或者

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

它必须在A以下,无论多少级。

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

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

这将在内部循环中完成,因此它必须表现良好。我曾想过计算'/',提取'..'的数量,提取'/./'的数量并比较它> = 1,但它都表现不佳并且感觉容易出现错误,因为输入是由用户。

是否有一个功能可以检查我不知道的或其他方式?

编辑:

如果有一种方法可以在我 chroot 之后授予我访问文件夹B的权限(如果我没记错的话,文件句柄保留在 chroot 之后,我需要它的文件夹版本),那也没关系。我只需要访问B,在 chroot 之后在其中创建/读取/写入文件。

编辑2:

顺便说一句,我知道一种使用 UID 之类的方法,但我需要另一种方法。

4

3 回答 3

2

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

执行此操作时,您需要确保不遵循符号链接或限制对它们的遍历。

初始启动可能会扫描经常访问的文件夹以进行记忆,直到收到请求并且系统处于空闲状态。所有请求都添加到记忆中(哈希表等)

您可以在此处找到详细信息。

于 2013-08-03T23:42:31.947 回答
2

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

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

于 2013-08-04T00:58:30.990 回答
0

假设“用户”不能免费访问系统,但本身具有足够的权限,我希望这chroot就是您正在寻找的解决方案。

因此,无需验证输入的目录结构,只需更改“根”,使其指向“A/” - 然后(如果需要)从路径的开头删除“A/”,并接受休息。

于 2013-08-03T23:32:50.730 回答