2011-08-20 48 views
4

我想有一个标准的功能,将相对路径转换为绝对路径,如果可能我想尽可能跨平台(所以我' d喜欢避免调用外部库函数)。这是为了防止路径利用。安全的跨平台功能,以获得规范化的路径

我知道这样的函数将无法检测到符号链接,但对于我的应用程序而言,我可以。

我可以推出自己的代码,但可能会有一些问题,例如,一个平台如何处理“../”模式的编码或变体。

有没有像这样的东西已经实施?

+0

跨平台是否意味着Windows? –

+0

这将是伟大的,如果它! :) 但是,任何指向正确路径的解决方案都是好的! – Waneck

回答

8

因为C或C++标准库中没有这样的函数,所以没有可以调用的单一通用函数。在Windows上,您可以使用GetFullPathName。在Linux,Mac OS X和其他基于Unix的系统上,您可以使用realpath(3)函数,该函数也可以解决符号链接问题。

请注意:任何对此的解决方案在单线程程序中都是可靠的。如果您使用多个线程,则另一个线程可能会出现并意外更改工作目录,从而更改路径名称解析。

+0

解决它!如果我有一个独立于额外库的实现会更好,因为我可以对不存在的路径使用相同的模式,例如远程路径,例如 – Waneck

+0

@Waneck:这些都不使用额外的库--GetFullPathName是kernel32.dll和'realpath(3)'在C库中,所以除非你做了一些不寻常的事情,比如不在标准库中进行链接,否则你没事。我也不确定你的意思是不存在的远程路径 - 如果路径不存在,这两个返回错误都应该能够处理网络路径(例如在Unix中为NFS/AFS,或者在Windows的情况下为UNC路径)。 –

+0

我的意思是像http路径; ) – Waneck

1

我认为最接近平台独立性的是POSIX libraries。特别是你会想看看unistd.h,不幸的是我不相信有一个“标准化”的路径概念。如果我没有记错的话,标准本身甚至不知道有关目录的知识,更不用说相关的知识。

为了获得比这更好的结果,我认为你需要推出自己的道路好吃的东西。

+0

如果我能保证它能覆盖所有情况,我就不会遇到自己的解决方案。我不确定,例如,如果有任何编码陷阱可能仍然容易受到攻击 – Waneck