Num*_*our 5 php absolute-path directory-browsing
有没有办法在PHP中如何确定给定相对路径的绝对路径而不实际解析符号链接?像realpath
功能但没有符号链接解析的东西.
或者,是否有一些简单的方法可以检查用户(使用我的浏览PHP脚本查看文件)是否不小心走出Apache虚拟主机的主目录?(或者不允许他使用令人讨厌的.和..在路径中)
谢谢!
我不知道 PHP 的本机解决方案,但这里有一个来自PHP 文档中评论的很好的绝对路径实现:
因为 realpath() 不适用于不存在的文件,所以我编写了一个函数。它将(连续)出现的
/
和替换为 、和过程\
中的任何内容。返回的路径在位置 0(字符串开头)或位置 -1(结尾)处不包含(反)斜杠。DIRECTORY_SEPARATOR
/.
/..
get_absolute_path()
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)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); }
正如您所看到的,它还产生尤达语。:)
(针对格式和拼写错误进行了编辑)