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 !