我有一個目錄和一個動態文件名。是否有任何功能可以用來確保不可能從指定的目錄中跳出?如何使用php正確建立文件路徑?
例如:
secure_path('/tmp/', 'file.txt') -> /tmp/file.txt
secure_path('/tmp/', '../file.txt') -> /tmp/file.txt
我有一個目錄和一個動態文件名。是否有任何功能可以用來確保不可能從指定的目錄中跳出?如何使用php正確建立文件路徑?
例如:
secure_path('/tmp/', 'file.txt') -> /tmp/file.txt
secure_path('/tmp/', '../file.txt') -> /tmp/file.txt
如果你只在單個目錄的工作,而不是子目錄下面你可以做
$file = "/tmp/".basename($input);
這應該給你在任何路徑結尾的文件名在輸入中給出,並將其追加到你想要的目錄。
我真的不知道該怎麼../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!
}
使用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
}