我有一个目录名和一个子路径,例如"./files"
和"/example.txt"
。虽然目录可以任意放在文件系统中,但我需要确保目录+子路径("./files/example.txt"
)实际上在给定目录中。所以这个例子是有效的,而子路径"/../example.txt"
将是无效的,因为它既不是目录的子节点,也不是孙子节点等。允许在目录之外的软链接。
我应该如何在C中执行此测试?
realpath(directory_subpath)
并将结果的开头与realpath(directory)
进行比较,但在阅读PATH_MAX
的问题后,我对此有点不确定,这也可能导致软链接问题。/../
开头,如果是,则导致无效。如果/../
存在于子路径中的任何其他位置,则将删除之前的目录名称(从左到右,重复此操作直到路径变为无效或到达路径名称的末尾)。 subpath
可能是出于恶意,因此我希望对此非常非常肯定。我的第二种方法安全吗?有不同的,更好的方式吗?
答案 0 :(得分:1)
如果检查/..
(没有斜杠),第二种方法是安全的。
我只是禁止..
在子路径中:..
真正需要且非恶意的情况相当罕见。