2011-04-02 111 views
4

我有一個目錄和一個動態文件名。是否有任何功能可以用來確保不可能從指定的目錄中跳出?如何使用php正確建立文件路徑?

例如:

secure_path('/tmp/', 'file.txt') -> /tmp/file.txt 
secure_path('/tmp/', '../file.txt') -> /tmp/file.txt 

回答

2

如果你只在單個目錄的工作,而不是子目錄下面你可以做

$file = "/tmp/".basename($input); 

這應該給你在任何路徑結尾的文件名在輸入中給出,並將其追加到你想要的目錄。

0

我真的不知道該怎麼../file.txt應該變成/tmp/file.txt在你的榜樣,但檢查的路徑是否是另一個的子路徑,使用realpath用一個簡單的對比:

$path = '../foo'; 
$allowedPath = '/tmp/'; 

$path = realpath($path); 
if (substr($path, 0, strlen($allowedPath)) !== $allowedPath) { 
    // path is not within allowed path! 
} 
2

使用realpath()獲得路徑的法服形式,並消除任何../ -s。然後驗證它是否包含要包含它的目錄的完整路徑。

如:

$path = "/tmp/file.txt"; 
$directory = "{full path of your files directory}"; 

if (strpos(realpath($path), $directory) === 0) { 
    // path OK 
} 
else { 
    // path not ok 
}