2011-08-20 15 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