【问题标题】:Check if file is *child of folder检查文件是否是文件夹的 *child
【发布时间】:2013-05-24 20:54:10
【问题描述】:

我有一个目录名和一个子路径,例如"./files""/example.txt"。虽然目录可以任意放置在文件系统中,但我需要确保目录+子路径 ("./files/example.txt") 实际上在给定目录中。所以这个例子是有效的,而子路径"/../example.txt" 是无效的,因为它既不是目录的子目录,也不是孙子目录等。允许在目录之外的软链接。

我应该如何在 C 中执行这个测试?

  • 我的第一个猜测是使用realpath(directory_subpath) 并将结果的开头与realpath(directory) 进行比较,但在阅读了PATH_MAX 的问题后,我对此有点不确定,这也可能导致软链接问题。
  • 我的第二个想法是简单地检查子路径是否以/../ 开头,如果是,则导致无效。如果/../ 存在于子路径中的任何其他位置,则将删除之前的目录名称(从左到右,重复此操作直到路径无效或到达路径名称的末尾)。李>

subpath 可能是出于恶意,所以我想非常非常确定这一点。我的第二种方法安全吗?有其他更好的方法吗?

【问题讨论】:

    标签: c directory filenames


    【解决方案1】:

    如果您检查/..(不带斜杠),第二种方法是安全的。

    我会在子路径中禁止.... 确实必要且不是恶意的情况相当罕见。

    【讨论】:

    • 感谢您的回复。为什么我必须省略尾部斜杠?对于子路径仅为"/.." 的情况,还是有其他原因?如果我将/ 替换为`, do the same rules apply about ..`,Windows 会怎样,或者还有什么需要考虑的吗?
    • 是的,我在考虑 subpath="/.." 的情况。是的,在 Windows 中几乎相同,尽管您可能会发现某些名称,如“NUL”或“AUX”不能用于文件。
    猜你喜欢
    • 2010-11-08
    • 2011-02-12
    • 1970-01-01
    • 2022-01-23
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多