2

私はしばらくの間この機能を持っていました:

function fixLink($url){
    return preg_replace('@/[^/]+/\.\./@','/',$url);
}

そして、それは次のように変換するのに驚異的に機能しました:
http://domain.com/page/../index.htmlhttp://domain.com/index.html
、最近私はそれを使用しなければなりませんでした:
http://domain.com/../index.htmlそして結果はhttp://index.html

この場合、修復されたリンクを次のように出力するようにドメイン名を保護するにはどうすればよいhttp://domain.com/index.htmlですか?

問題に取り組む方法についてのアイデアを探している場合は、コードを使いすぎないでください。

4

1 に答える 1

3
function fixLink($url) {
    $parts = parse_url($url);
    if (empty($parts['path']) || empty($parts['scheme'])) {
        return $url;
    }
    $parts['path'] = preg_replace('@[^/]+/\.\./@', '', $parts['path']);
    $parts['path'] = preg_replace('@^/\.\./@', '/', $parts['path']);
    $parts['scheme'] .= '://';
    return implode('', $parts);
}

ただし、上記はすべての状況を解決するわけではありません。より堅牢なバージョンは次のようになります。

function fixLink($url) {
    $parts = parse_url($url);
    if (empty($parts['scheme']) || empty($parts['path'])) {
        return $url;
    }
    $path = array();
    foreach (explode('/', $parts['path']) as $i => $item) {
        if ($item == '..') {
            if (count($path) > 1) {
                array_pop($path);
            }
        } else {
            $path[] = $item;
        }    
    }
    $parts['scheme'] .= '://';
    $parts['path'] = implode('/', $path);
    return implode('', $parts);
}
于 2013-01-08T06:52:45.087 に答える