【问题标题】:traversing directories with php?用php遍历目录?
【发布时间】:2012-07-13 11:05:19
【问题描述】:

我有一个文件夹路径(例如/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。我该怎么做?

【问题讨论】:

  • php有权限打开shis文件夹吗?用干净的路径'/var/www/tester/assets/themes/cache/css/ie7.css'试试,看看你得到了什么
  • "运行脚本必须对层次结构中的所有目录具有可执行权限,否则 realpath() 将返回 FALSE。" - 来自文档...

标签: php relative-path realpath directory-traversal


【解决方案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 

包含给定文件的文件夹是否存在?

【讨论】:

    【解决方案2】:

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

    注意:您是否知道您可能会在此处产生安全风险?如果用户提供../../../../../../../etc/passwd 怎么办?

    【讨论】:

    • 我在错误的上下文中使用了“用户”。他们是我正在创建的 php 库的用户。配置文件提供的路径。没有安全风险。 “用户”可以编写自己的脚本来做到这一点。不过很好的提示。
    • 另外,如果多次使用该路径,会不会有一些(可能可以忽略不计,但仍有一些)开销?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多