用php遍历目录?

时间:2012-07-13 11:05:19

标签: php relative-path realpath directory-traversal

我有一个文件夹的路径(例如/var/www/tester/assets/themes/default/css/)。

例如,用户可以提供文件夹的相对路径。 layout/ie7.css会给出/var/www/tester/assets/themes/default/css/layout/ie7.css的路径。

这很好用,但我希望用户也可以在目录树中向上导航。

如果用户提供../../cache/css/ie7.css,请再次使用css文件夹的路径。我希望路径最终为/var/www/tester/assets/themes/default/cache/css/ie7.css

我想我可以将它们一起传递给realpath()例如:

$base = '/var/www/tester/assets/themes/default/css/';
$user_path = '../../cache/css/ie7.css';
$final_path = realpath($base.$user_path);

但这只会返回false。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

首先,真实路径功能还会检查给定路径是否存在...您确定您的路径是否存在???

/var/www/tester/assets/themes/default/css/../../cache/css/ie7.css 

不会结束

/var/www/tester/assets/themes/default/cache/css/ie7.css 

按照你的建议,但最终会在

中结束
/var/www/tester/assets/themes/cache/css/ie7.css 

这个文件夹是否存在给定文件?

答案 1 :(得分:0)

请不要。像/var/www/tester/assets/themes/default/css/../../cache/css/ie7.css这样的路径没有任何问题。它适用于所有操作系统和浏览器。

注意:您是否意识到您可能在此处造成安全风险?如果用户提供../../../../../../../etc/passwd会怎样?