Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   микрофайлообменник Php (https://forum.antichat.xyz/showthread.php?t=36233)

Talisman 23.03.2007 22:40

микрофайлообменник Php
 
Привет! Сейчас я покажу микроурок мастерства ) ну.. конечно, я не исключаю косяки в своей проге, но все же претендую на безопасность
Писать будем не сайт, а файлообменник для мобилы - минимум диза, максимум простоты и удобства админу.
Итак, мы напишем скрипт, который будет брать файлы из директорий, выводить их листинг и еще кое что, приступим
PHP код:

  function scan_dir($dirname)
  {
    GLOBAL 
$text$retext;
    
$dir opendir($dirname);
    while ((
$file readdir($dir)) !== false)
    {
      if(
$file != "." && $file != "..")
      {
      if(
is_file($dirname."/".$file))
        {
              echo 
'<a href="/s/'.$dirname.$file.'">'.$file.'</a><br />';
        }
        if(
is_dir($dirname."/".$file))
        {
              echo 
'<a href="/s/'.$dirname.''.$file.'/"><font color="red"><img src="/s/folder.ico">'.$file.'</font></a><br />';
        }
      }
    }
    
closedir($dir);
  } 

Это функция рекурсивного обхода директории, которая при обнаружении файла (if_file) выводит его имя и линк на него, при обнаружении же диры, выводит картинку и ссылку на диру.
Вот так будем давать линк на диру:
http://demo.my/s/f/soft/
где http://demo.my/s/f/ - коренвая папка с файлами. а на файлы будем давать линки вроде: http://demo.my/s/f/kaleostra.txt - т.е. как обычный веб сервер, только прикол в том, что обрабатывать все это будет наш скрипт, для чего занесем в штаксесс файл следующие строчки:
Цитата:

RewriteEngine On
Options +FollowSymLinks
RewriteRule f/ scan.php
первой строчкой мы запускаем модуль апача для ЧПУ, второй приказываем использовать относительные переходы по каталогу веб-сервера, а третьей задаем правило - все запросы ниже папки f/ передавать скрипту scan.php:
НО для начала поясню, что делается в этом файле - для простоты будем только сканить директорию, если юзер послал запрос на диру, или выдавать файл, занося данные в лог скачки файлов, примерно следующего содержания:
Цитата:

f/problems.txt:7
f/kaleostra.txt:3
f/ofice/QReader.sis:1
где до двоеточия стоит имя файла, а после - сколько раз его скачали
PHP код:

<?php
// echo($_SERVER["REDIRECT_URL"]); - стррока запроса пользователя вида: /s/f/file.txt или /s/f/folder/

//// фильтруем эту входящую строчку, точнее срезаем начальные /s (т.к. скрипт лежит у нас не в корне сайта, а папке 's') (хотя впринципе можно сменить рабочую директорию :) )
$URL=substr($_SERVER["REDIRECT_URL"],3); // срезаем первые 2 символа, т.е. копируем строку с третьего, и превращаем ее в вида: /f/some flood :)

if(is_file($URL))  //// это файл, отдаем пользователю.
{
      
///отдаем пользователю
      
header('Content-type: */*'); // посылаем заголовки
      
header('Content-Disposition: attachment; filename="'.$URL.'"'); // имя файла
      
readfile($URL); // и сам файл :)
      ///заносим данные в лог скачек
      
$log=file('log.txt'); // заносим файл в массив
      
$f=fopen('log.txt','w'); // открываем его для перезаписи
      
$c=false// устанавливаем флаг в false (зачем он - поймете дальше)
      
foreach($log as $log_line // - разбиваем лог файл на строчки
      
{
       if(
strlen($log_line)>3// откидываем заведомо пустые строчки (просто перестраховка)
       
{  
         list(
$filename,$count)=split(':',$log_line); // разбиваем их по двоеточию
         
if($filename==$URL// если имя запрошенного файла совпадает с этой строчкой до двоеточия, то
         
{
           
$count=$count+1// увеличиваем счетчик загрузок на 1
           
fwrite($f,$URL.':'.$count."\r\n"); // записываем новые данные в файл лога скачки
           
$c=true// устанавливаем флаг, т.е. файл уже есть в логе!
         
}else
         {
                 
fwrite($f,$log_line); // остальные стрчоки переписываем без изменений
         
}
       }
      }
      if(
$c==false// если ни один файл не увеличил свой счетчик, значит этот файл был скачан впервые, добавим его к логу
      
{
          
fwrite($f,$URL.":1\r\n");    
      }
          
fclose($f); // закрыли файл лога
          
exit;  // убили скрипт :)

}
  function 
scan_dir($dirname)  // наша "рекурсия"
  
{
    GLOBAL 
$text$retext;
    
$dir opendir($dirname);
    while ((
$file readdir($dir)) !== false)
    {
      if(
$file != "." && $file != "..")
      {
      if(
is_file($dirname."/".$file))
        {
              echo 
'<a href="/s/'.$dirname.$file.'">'.$file.'</a><br />';
        }
        if(
is_dir($dirname."/".$file))
        {
              echo 
'<a href="/s/'.$dirname.''.$file.'/"><font color="red"><img src="/s/folder.ico">'.$file.'</font></a><br />';
        }
      }
    }
    
closedir($dir);
  }
if(
is_dir($URL)) // если запросили диру - выводим ее листинг
{
  
scan_dir($URL);
}else 
// посылаем нафиг, т.к. случай файла рассматривали выше :)
{
  echo 
'we are sorry... :(';
  exit;
}
  echo 
'<a href="/s/f/"><font color="red">-home-</font></a>'// выводим линк на главную пагу обменника
?>

Наверно вы скажете, что если ввел адрес вида: http://demo.my/s/f/soft/../../../../../etc.passwd то думаете получити файл паролей? фиг вам! ведь это урл, а не параметры, переходящие в файл, поэтому апач вам выдаст главную пагу сайта (смотря как глубоко опуститесь, но глубже маинпаги никак )
Впервые подобный скриптик я писал года 2 назад, для сайта по мобилам, естессно, функций было больше правда реврайтэнжине я тогда не умел использовать, и приходилось производить очень много фильтраций ))) а совсем недавно создал аналогичный файлообменник для себя. (ЗЫ линк не дам, мейби тока скрины, т.к. его адрес не всем согласен дать... ))
ЗЫ задолбался постить такие вещи в статьи, но в разделе о веб-кодинге нет соответствующего подкаталога, например уроки, а не хочется, чтобы твой труд утонул среди вопросов.

Sn@k3 24.03.2007 00:08

урок мастерства? ты се льстишь...

Darkweider 24.03.2007 00:17

Да не вроде норм, тока я через мобильник в инет не захожу...

Talisman 24.03.2007 00:48

Цитата:

Сообщение от Sn@k3
урок мастерства? ты се льстишь...

читай конец про недостающий раздел ))) в маленьких объемах самолесть поднимает настроение :)))


Время: 23:19