Навигатор сайта : Разделы Информационные технологии Простой файловый менеджер на php

Простой файловый менеджер на php

Так уж получилось, что давеча одному моему знакомому пришлось проходить одно дистанционное обучение. Качество материалов было ужасное, как и большинство дистанционных курсов в нашей Российской Федерации, в чем я убедился самостоятельно. Хотел бы отвлечься и сказать, что, к моему великому сожалению классическое образование времен СССР втоптали в грязь, а систему, которую построили на его костях, настолько испоганили различными экспериментами, по другому называемыми "побыстрее срубить бабла, а пипл схавает", что просто не хватает слов.

То же со школами, то же и с институтами... так вот, как упомянул ранее, проходил мой знакомый дистанционное обучение в одном таком институте... Когда я сам взглянул на материалы обучения, я мягко говоря был в шоке: они изобиловали ошибками и далекими от реальности знаниями... А учили их защите информации... те люди, которые сами по настоящему не научились защищать информацию. О чем далее...

После попыток осмыслить теоретическую часть курса, моим знакомым решено было не ломать себе голову, не тратить впустую время на эту х... ерунду, а где-то на сайте раздобыть ответы, по-быстрому пройти тесты и забыть об этом обучении как о страшном и кошмарном сне. С чем он и обратился ко мне.

Изучение интерфейса веб-программы для обучения сразу же выявило несколько багов. Во-первых форум не фильтровал служебные символы, а значит любой вверденный туда html-текст, отображался как есть и я при желании мог выполнить любой JavaScript, т.е. увести сессию/кукисы администратора, но решено было исследовать возможности программы на баги дальше.

Каково же было моё удивление, когда я обнаружил в интерфейсе не просто дыру, а ДЫРИЩУ!!!, а именно возможность загрузить свою фотографию в какое-то секретное место на сайте, папку, и расширение моего файла фото абсолютно не проверялось. То есть я мог загрузить абсолютно любой файл, даже исполняемый. Попробовал загрузить 1.txt и, о чудо!, программа его "схавала".

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

При том что самой фотогалереи или возможности отображения собственного фото в настройках - НЕ БЫЛО!!!

Для начала нужно было найти эту секретную папку для фото... Искать долго не пришлось, она называлась классическим образом (а Вы тоже называете папки для изображений images, image или photos?)

Ну а когда она была найдена, мною был создан простенький файловый менеджер, позволяющий ходить по папкам, сканировать их содержимое и выводить код любого файла сайта на экран (что можно было использовать для получения пароля к базе данных сайта со всеми ответами).

Знакомому файл, разумеется, не дал, сказал, чтобы он не безобразничал, а учился. Надо значит надо!

Сам им тоже не воспользовался - не я же учусь. :-)

А вот кодом файлового менеджера делюсь с Вами:

 

<?php
    //сайты зачастую пишут в кодировке Unicode
    header("Content-type: text/html; charset=cp1251"); //задаем кодировку имен файлов, наш файл должен быть сохранен в той же, для облегчения

    $myname = 'manage.php'; //имя этого файла

    function find_and_replace($dir,$showfiles) {
      $new_dir = null;
      $dir_files = opendir($dir);
      while(false !== ($file = readdir($dir_files))) {
        if($file != '.' && $file != '..')
        $new_dir[] = $dir."/".$file;
      }
      if($new_dir) {
        foreach($new_dir as $check ) {
           $bn = basename($check).PHP_EOL; //получаю имя файла или папки
           if(($showfiles) && (is_file($check))) {
             echo '<li><a href="'.$myname.'?file='.$check.'">'.$bn.'</a>&nbsp;';
             echo date('Y-m-d',filemtime($check)).'&nbsp;';
             echo '<a href="'.$myname.'?file='.$check.'&action=delete" title="Удалить">X</a>';
             echo '</li>';
           }
           elseif(is_dir($check)) {
             echo '<li><a href="'.$myname.'?file='.$check.'">'.$bn.'</a>&nbsp;&nbsp;';
             echo '<a href="'.$myname.'?file='.$check.'&action=delete" title="Удалить">X</a>';
             echo '</li>';
             echo '<ul>';
             find_and_replace($check,$showfiles);
             echo '</ul>';
           }
        }
      }
    }

    $fp = dirname($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'].'/'); //путь к нашему файлу
    //какой файл
    if (array_key_exists("file", $_REQUEST))
     $file = $_REQUEST["file"];
      else $file = $fp;

    //что делать будем
    if (array_key_exists("action", $_REQUEST))
     $action = $_REQUEST["action"];
      else $action = 'show';

    echo '<a href="'.$myname.'">В НАЧАЛО</a><p>';
    echo '<a href="'.$myname.'?file='.((array_key_exists("file", $_REQUEST))?dirname($file):$file).'">ВВЕРХ</a><p>';

    if ($action == 'show') {
       if (file_exists($file)) {
            if (is_file($file)) {
            $contents=file_get_contents($file);
              $contents=nl2br(htmlspecialchars($contents));
            echo $contents; //выводим содержание
         } else { //иначе выводим содержимое папки и её подпапок
            echo '<ul>';
            find_and_replace($file,true);
            echo '</ul>';
         }
       } else {
         die($file.' не найдено!');
       }
    } else if ($action == 'delete') {
       if (file_exists($file)) {
            if (is_file($file)) {
              if (unlink($file)) echo 'Файл '.$file.' удален!';
            }
         else {
           if (deleteDir($file)) echo 'Дирректория '.$file.' удалена!';
           }
       } else {
         die('Файл '.$file.' не найден!');
       }
    }

 //удаляет папку со всем содержимым
 function deleteDir($dir) {
   if (substr($dir, strlen($dir)-1, 1) != '/')
       $dir .= '/';

   if ($handle = opendir($dir)) {
       while ($obj = readdir($handle)) {
           if ($obj != '.' && $obj != '..') {
               if (is_dir($dir.$obj)) {
                   if (!deleteDir($dir.$obj))
                      return false;
               }
               elseif (is_file($dir.$obj)) {
                   if (!unlink($dir.$obj))
                       return false;
               }
           }
       }
       closedir($handle);
       if (!@rmdir($dir))
           return false;
       return true;
   }
   return false;
 }
?>

Данный файл может принимать в качестве параметров file (имя файла или папки, можно указать абсолютный или относительный путь), а также action (возможны варианты show - показать содержимое файла или папки; delete - удалить файл, папку). Например:

manage.php?file=../folder/connect.php&action=show

Кроме того, при вызове моего простого файлового менеджера без параметров, отображается содержимое папки в которой Вы сейчас находитесь. То есть основные команды: хождение по папкам, просмотр содержимого папок и файлов, а также их удаление, Вы можете делать с помощью мыши.

________________

Данная информация дана исключительно в ознакомительных целях, никакой ответственности за её использование автор не несет. Рекомендую использовать данную статью исключительно для собственного развития и никоим образом не для вреда кому-либо или чему-либо.

Комментарии  

 
0 # СортировкаGuest 26.04.2013 22:11
Уважаемый автор, не могли бы вы написать сей скрипт с сортировкой папок от файлов и без вывода вложенных файлов директории в корневой папке? Буду очень благодарен.
Цитировать | Сообщить модератору
 
 
0 # К сожалению, нет времени на доработкуEcolora 27.04.2013 00:11
Поскольку данный скрипт всё, что требуется от него, выполнил, не имею достаточно времени на его доработку. Предоставляю это Вам. :)
Цитировать | Сообщить модератору
 
 
0 # СпасибоGuest 27.04.2013 15:02
Ну и на этом тоже спасибо!
Цитировать | Сообщить модератору
 
 
+1 # СпасибоGuest 11.06.2015 10:11
Шикарная вещь! Это то, что искал: самостоятельный php-скрипт, который легко перестраивается под свои нужды
Цитировать | Сообщить модератору
 

Добавить комментарий


Защитный код
Обновить

Счетчик определения тИЦ и PR Яндекс.Метрика

для детей старше 12 лет