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 !

