Navigare un filesystem con uno script PHP

EDIT: Sono state apportate delle correzioni allo script che per ragioni di visualizzazione del codice risultava completamente sbagliato! Inoltre ho provveduto a fornire il file sorgente in allegato alla pagina. Chiedo venia!

 

Non sono il primo e non sarò certo l'ultimo che ha o ha avuto necessità di navigare delle cartelle di un File System mediante un semplice script PHP.

Ho deciso di pubblicare la mia soluzione, che avevo per pigrizia evitato di scrivere fino a che il passaggio da EasyPHP a XAMPP non mi ci ha costretto.

Lo script è molto semplice e a dire il vero anche molto rudimentale e sensibile di cambiamenti.

Lo script che ho chiamato list_dir.php è il seguente:

CSS

<style type="text/css">
body, html { background:#F9CC76; } 
html * { font-family: verdana; font-size: 14px; }
a.out_link { color:#F67721; text-decoration:none; }
a { text-decoration:none; }
h3 { color:black; font-size:15px; }
div#container { margin:10px auto 0 auto; width:30%; background:#CCFFCC; border:1px solid #669966; }
table#Tlist { width:80%; margin:0 auto 21px auto; }
table#Tlist tbody tr td { padding:3px; border-bottom:1px solid #669966; }
table#Tlist thead tr th, table#Tlist tfoot tr td { text-align:right; font-weight:bolder; }
</style>

 

PHP

<div id="container">
<table id="Tlist">
    <thead>
        <tr>
            <th colspan="1" id="header" >
                <h3> PHP DIRECTORY EXPLORER</h3>
                <?php
                if($_GET["ex_path"])
                {
                    ?>
                    <a href="javascript:history.back();" title="torna indietro">back </a> ~ <a href="/list_dir.php" title="torna alla root"> root </a>
                    <?php
                }
                else echo "back  ~  root";
                ?>
            </th>
        </tr>
    </thead>
    <tbody>
        <?php
        //il path di partenza
        $path = dirname(__FILE__);
        if($_GET["ex_path"])
        {
            // RIPULISCO IL PATH DA POTENZIALI PERICOLI
            $_GET["ex_path"] = str_replace(".","",$_GET["ex_path"]);
            $_GET["ex_path"] = str_replace("..","",$_GET["ex_path"]);
            $path = dirname(__FILE__).str_replace("/","\\",$_GET["ex_path"]) ; //PATH ESTESO
        }

        $fd = array("file","dir");
        $iterator = new DirectoryIterator($path);
        while($fdStep = array_pop($fd))
        {
            foreach ($iterator as $file)
            {
                if(($file->isDir() && $fdStep == "file") || ($file->isFile() && $fdStep == "dir") || ($file->isDot())) continue;
                ?>
                <tr>
                    <td>
                        <?php
                            if ($file->isDir())
                            {
                                ?>
                                <a href="/list_dir.php?ex_path=<?php echo $_GET["ex_path"]."/".$file; ?>"> /<?php echo $file; ?>/ </a>
                                <?php
                            }
                            elseif($file->isFile())
                            {
                                ?>
                                <a <?php if($file=="index.php") print "class='index_link'"; ?> href="<?php echo $_GET["ex_path"]."/".$file; ?>"> <?php echo $file; ?></a>
                                <?php
                            }
                        ?>
                    </td>
                </tr>
                <?php
            }
        }
        ?>
    </tbody>
    <tfoot>
        <tr>
            <td colspan="1" >
                <a class="out_link" href="https://www.unmoscerinonelweb.com/blog">un moscerino nel web</a>
            </td>
        </tr>
    </tfoot>
</table>
</div>

per far si che funzionasse nella mia www di XAMPP ho modificato il file index.php come segue:

<?php
if (!empty($_SERVER['HTTPS']) && ('on' == $_SERVER['HTTPS'])) {
	$uri = 'https://';
} else {
	$uri = 'http://';
}
$uri .= $_SERVER['HTTP_HOST'];
//header('Location: '.$uri.'/xampp/');
header('Location: '.$uri.'/list_dir.php');
exit;
echo "Something is wrong with the XAMPP installation :-(";
?>

 

ATTENZIONE
il codice potrebbe presentare dei bug di sicurezza di cui non mi ritengo responsabile.
Vi consiglio, pertanto di utilizzarlo solo in locale.

NOTE: Sono stati apportati delle migliorie, opzionali, al codice che necessitano di un supporto jquery.

Deve essere attiva l'estensione extension=php_fileinfo.dll !