没有符号链接解析的绝对路径/将用户保留在主目录中

Num*_*our 5 php absolute-path directory-browsing

有没有办法在PHP中如何确定给定相对路径的绝对路径而不实际解析符号链接?像realpath功能但没有符号链接解析的东西.

或者,是否有一些简单的方法可以检查用户(使用我的浏览PHP脚本查看文件)是否不小心走出Apache虚拟主机的主目录?(或者不允许他使用令人讨厌的.和..在路径中)

谢谢!

Kar*_*lis 2

我不知道 PHP 的本机解决方案,但这里有一个来自PHP 文档中评论的很好的绝对路径实现:

因为 realpath() 不适用于不存在的文件,所以我编写了一个函数。它将(连续)出现的/和替换为 、和过程\中的任何内容。返回的路径在位置 0(字符串开头)或位置 -1(结尾)处不包含(反)斜杠。DIRECTORY_SEPARATOR/./..get_absolute_path()

function get_absolute_path($path) {
   $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
   $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
   $absolutes = array();
   foreach ($parts as $part) {
       if ('.' == $part) continue;
       if ('..' == $part) {
           array_pop($absolutes);
       } else {
           $absolutes[] = $part;
       }
   }
   return implode(DIRECTORY_SEPARATOR, $absolutes);
}
Run Code Online (Sandbox Code Playgroud)

一个测试:

var_dump(get_absolute_path('this/is/../a/./test/.///is'));
Run Code Online (Sandbox Code Playgroud)

返回:

function get_absolute_path($path) {
   $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
   $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
   $absolutes = array();
   foreach ($parts as $part) {
       if ('.' == $part) continue;
       if ('..' == $part) {
           array_pop($absolutes);
       } else {
           $absolutes[] = $part;
       }
   }
   return implode(DIRECTORY_SEPARATOR, $absolutes);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它还产生尤达语。:)

(针对格式和拼写错误进行了编辑)