ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

микрофайлообменник Php
  #1  
Старый 23.03.2007, 22:40
Аватар для Talisman
Talisman
Постоянный
Регистрация: 22.04.2006
Сообщений: 566
Провел на форуме:
1325772

Репутация: 517


Отправить сообщение для Talisman с помощью ICQ
По умолчанию микрофайлообменник 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 назад, для сайта по мобилам, естессно, функций было больше правда реврайтэнжине я тогда не умел использовать, и приходилось производить очень много фильтраций ))) а совсем недавно создал аналогичный файлообменник для себя. (ЗЫ линк не дам, мейби тока скрины, т.к. его адрес не всем согласен дать... ))
ЗЫ задолбался постить такие вещи в статьи, но в разделе о веб-кодинге нет соответствующего подкаталога, например уроки, а не хочется, чтобы твой труд утонул среди вопросов.
 
Ответить с цитированием

  #2  
Старый 24.03.2007, 00:08
Аватар для Sn@k3
Sn@k3
Познавший АНТИЧАТ
Регистрация: 13.04.2006
Сообщений: 1,738
Провел на форуме:
5151669

Репутация: 1198


Отправить сообщение для Sn@k3 с помощью ICQ
По умолчанию

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

  #3  
Старый 24.03.2007, 00:17
Аватар для Darkweider
Darkweider
Участник форума
Регистрация: 08.02.2007
Сообщений: 162
Провел на форуме:
463978

Репутация: 34
По умолчанию

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

  #4  
Старый 24.03.2007, 00:48
Аватар для Talisman
Talisman
Постоянный
Регистрация: 22.04.2006
Сообщений: 566
Провел на форуме:
1325772

Репутация: 517


Отправить сообщение для Talisman с помощью ICQ
По умолчанию

Цитата:
Сообщение от Sn@k3  
урок мастерства? ты се льстишь...
читай конец про недостающий раздел ))) в маленьких объемах самолесть поднимает настроение ))
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ