确定路径是否在目录内
Determine if path is inside directory
在我的应用程序中,我试图检查路径是否在特定目录内。例如,我希望我的应用程序的某些部分无法访问路径 /x/y/z
中的文件。我不能使用传统的文件权限,因为应用程序的其他部分应该能够访问这些文件。
一些 Internet 资源建议使用 realpath
来首先规范化路径,即解析 ..
的所有符号链接和实例(例如 1, 2)。
但是,似乎不可能在没有竞争条件 (TOCTOU) 的情况下执行路径解析,然后执行 open
。
char *resolved = realpath("/my/potentially/dangerous/path.txt", NULL);
// someone changes any part of the path to a symlink to something else <--- race condition
if (check_path(resolved)) {
// <--- race condition
int fd = open(resolved, O_RDONLY);
}
我是不是忽略了什么,或者 POSIX(和 Linux)没有提供任何方法在没有竞争条件的情况下做这样的事情?
'openat2' 怎么样(仅限 Linux)?
一旦有了文件描述符,请查看 man open
Description:
A file descriptor is a reference to an open file description; this
reference is unaffected if pathname is subsequently removed or
modified to refer to a different file.
在我的应用程序中,我试图检查路径是否在特定目录内。例如,我希望我的应用程序的某些部分无法访问路径 /x/y/z
中的文件。我不能使用传统的文件权限,因为应用程序的其他部分应该能够访问这些文件。
一些 Internet 资源建议使用 realpath
来首先规范化路径,即解析 ..
的所有符号链接和实例(例如 1, 2)。
但是,似乎不可能在没有竞争条件 (TOCTOU) 的情况下执行路径解析,然后执行 open
。
char *resolved = realpath("/my/potentially/dangerous/path.txt", NULL);
// someone changes any part of the path to a symlink to something else <--- race condition
if (check_path(resolved)) {
// <--- race condition
int fd = open(resolved, O_RDONLY);
}
我是不是忽略了什么,或者 POSIX(和 Linux)没有提供任何方法在没有竞争条件的情况下做这样的事情?
'openat2' 怎么样(仅限 Linux)?
一旦有了文件描述符,请查看 man open
Description:
A file descriptor is a reference to an open file description; this reference is unaffected if pathname is subsequently removed or modified to refer to a different file.