清理网址,以便" /../"被删除

时间:2014-08-04 14:54:57

标签: php directory backtracking

是否有PHP方式处理用户输入网址而不是:

http://example.com/directory/../index.php

它变成了

http://example.com/index.php

同时保留其他所有内容,例如查询参数完好无损?

优选没有正则表达式或字符串替换。请尽可能通用,而不依赖操作系统。

编辑:要添加一些上下文,我的脚本会动态构建上面的网址,这会导致我网站上的特定脚本,并且我将生成的网址作为回调/重定向网址传递给Google+登录API,但Google不接受回调网址中的此类“非标准”字符。

1 个答案:

答案 0 :(得分:0)

这个代码片段可以用PHP方式完成,没有正则表达式:

$url = "http://www.example.com/data/data2/data3/../../page.html";
$parts = explode("/",$url);
while ($index = array_search('..', $parts)) {
    unset($parts[$index]);
    unset($parts[$index-1]);
    $parts = array_values($parts);
}

需要调用array_values来重新索引$ parts数组,以处理“..”出现多次的情况,如示例所示。

考虑到查询字符串包含子字符串“/../”的情况,可以将代码段改进为:

$url = "http://www.example.com/data/data2/data3/../../page.html?url=/../b";
$pieces = explode("?",$url);
$parts = explode("/",$pieces[0]);
while ($index = array_search('..', $parts)) {
    unset($parts[$index]);
    unset($parts[$index-1]);
    $parts = array_values($parts);
}
if (count($pieces)>1) {
    echo join("?",array(join("/",$parts),$pieces[1])) . "\n";
} else {
    echo join("/",$parts) . "\n";
}