Скрытый ../ В реальные каталоги PHP - PullRequest
0 голосов
/ 28 декабря 2011

Я делаю небольшой скрипт просмотра файлов, используя PHP и Javascript, и у меня возникла небольшая проблема.Текущий каталог сохраняется как GET в URL-адресе как index.php?dir=/projects/jphp, когда он находится в базе.Затем я сохраняю это в variabe $scandir, используя:

$scandir = $_GET['dir'];

, поскольку поля перечислены в таблице, чтобы пользователи могли просматривать их, папки помечены гиперссылками следующим образом:

<td><a style="color: red;" href="edit.php?pid=<?php echo $project['id'] ?>&dir=<?php echo $scandir . "/" . $thisfile; ?>"><?php echo $thisfile; ?></a></td>

Переменная $thisfile заполняется с помощью цикла foreach(), который проходит через каждый файл в каталоге.Когда пользователь начинает просматривать папки и файлы, адрес файла становится грязным, поэтому, например, после минуты просмотра файлов, $_GET['dir']; выглядит так:

projects/jphp/js/../js/../../../projects/jphp

, есть ли способ сохранитьпростые пути, такие как путь выше, точно такие же, как

projects/jphp

Если вы знаете, как перевернуть верх в низ, это было бы здорово, спасибо!Я, возможно, не объяснил это хорошо, поэтому дайте мне знать, что я не имею смысла.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Функция realpath() делает то, что вы ищете. Если вы не получаете никаких результатов, проверьте права доступа к вашей папке:

The running script must have executable permissions 
on all directories in the hierarchy, otherwise 
realpath() will return FALSE.
0 голосов
/ 28 декабря 2011

Я думаю, что вы можете заменить свои ссылки, например, &dir=/some/path/../ на &dir=/some/, поэтому просто укажите не /some/path/../, а /some/, они равны.

UPD:

Например,

<?php
$dir = $scandir;
if( $dir=='..' ){
    if( $scandir=='' || $scandir=='/' ){
        // skip this entry using continue or something else
    }
    if( substr($scandir,-1)=='/' ){
        $dir = dirname(substr($scandir,0,-1)).'/';        
    }else{
        $dir = dirname($scandir).'/';
    }
    if( $dir=='' ){
        $dir = '/';
    }
}else{
    $dir = $scandir.'/'.$thisfile;
}
?>
<td><a style="color: red;" href="edit.php?pid=<?php echo $project['id'] ?>&dir=<?php echo $dir; ?>"><?php echo $thisfile; ?></a></td>
...