Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: FTP сканер
 
 автор: aievengo   (07.01.2012 в 03:01)   письмо автору
 
 

Доброго времени суток. Возникла необходимость написать простенький ftp сканер. Воспользовался Вашим шаблоном и немного его усовершенствовал. Необходимо было сделать так, что бы сканер подключался к серверу по ftp, считывал название файла, его размер, а также первые и последние 64 байта, и после этого все значения заносились бы в базу данных. В итоге для тестовых директорий с тестовыми текстовыми файлами сканер работает без проблем, а при работе с реальными файлами на сервере при считывании первых и/или последних 64 байт возникают проблемы. С чем бы это могло быть связано? Привожу код сканера.

index.php
<?php 
  
// Устанавливаем соединение с FTP-сервером 
  
require_once("config_ftp.php"); 
  require_once(
"config_mysql.php"); 
  require_once(
"scan_ftp.php");
 
  
// Директория на сервере 
  
$dir = "scaner/public_html"; 
  
// Очищаем устаревшие данные в базе данных
  
$query = "TRUNCATE data";
  if (!
mysql_query($query))
  {
    echo 
'Ошибка очистки базы данных';
  }
  
// Запускаем сканер 
  
scan_ftp($link, $dir); 
  
// Закрываем соединение с FTP-сервером 
  
ftp_close($link); 
  
// Вывод результатов
  
require_once 'output.php';  
?>


mysql_config.php
<?php
  
// MYSQL connect
  // MySQL server address
  
$dblocation = 'localhost';
  
// name of database on hosting
  
$dbname = '**********';
  
// name of the database user
  
$dbuser = '**********';
  
// and his password
  
$dbpasswd = '**********';
  
 
  
// set connection with database
  
$conn = mysql_pconnect($dblocation, $dbuser, $dbpasswd);
  if (!
$conn)
  {
      echo 
"Невозможно установить соединение с MySQL-сервером";
  }

  
  
// select database
  
if (!mysql_select_db($dbname, $conn))
  {
      echo 
"Ошибка выбора базы данных";
  }
   
  
// Specify the character encoding, in which data  will be sent MySQL-server
  
mysql_query("SET NAMES 'utf-8'");
  
mysql_query("SET collation_connection='utf8_general_ci'");
  
mysql_query("SET collation_server='utf8_general_ci'");
  
mysql_query("SET character_set_client='utf8'");
  
mysql_query("SET character_set_connection='utf8'");
  
mysql_query("SET character_set_results='utf8'");
  
mysql_query("SET character_set_server='utf8'")
?>


ftp_config.php
<?php 
  
// FTP connect
  // Адрес FTP-сервера 
  
$ftp_server = "************"; 
  
// Порт соединения 
  
$ftp_port = 21; 
  
// Пользователь 
  
$ftp_user = "************"; 
  
// Пароль 
  
$ftp_password = "************"; 
  
// Версия Web-приложение 
  
$version = "1.0.0"; 
  
// Устанавливаем время исполнения скрипта 120 с 
  
@set_time_limit(120); 
  
// Пытаемся установить соединение с FTP-сервером 
  
$link = ftp_connect($ftp_server, 21, 20); 
  if(!
$link) puterror("К сожалению, не удаётся установить соединение с FTP-сервером $ftp_server"); 
  
// Осуществляем регистрацию на сервере 
  
$login = ftp_login($link, $ftp_user, $ftp_password); 
  
//$login = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
  
if(!$login) puterror("К сожалению, не удаётся зарегистрироваться на сервере"); 
  
// Небольшая вспомогательная функция, которая выводит сообщение об ошибке 
  // в окно браузера 
  
function puterror($message) 
  { 
    echo 
"<center><p class=help>$message</p>"; 
    exit(); 
  } 
?>


output.php
<?php
  
// Извлекаем сведения из базы данных
  
$query = "SELECT * FROM data ORDER BY name";

  
$result = mysql_query($query);
  if(!
$result)  
  {
    echo 
'Ошибка обращения к базе данных';
  }

      echo 
'<table width=100% border=1>     
                <tr>
                  <td width=15% align=center>Имя файла</td>
                  <td width=25% align=center>Путь</td>
                  <td width=10% align=center>Размер</td>
                  <td width=25% align=center>Первые 64 байта</td>
                  <td width=25% align=center>Последние 64 байта</td>
                </tr>'
;
    
     if(!
mysql_num_rows($result))
     {
         echo 
"<tr><td align=center colspan=4>Нет данных</td></tr>";
     }
   ;
    
     while (
$data = mysql_fetch_assoc($result))
     {  
        echo 
"<tr><td width=15% align=center >
                           
$data[name]</td>";
        echo 
"<td width=25% align=center >
                           
$data[path]</td>";
         echo 
"<td width=10% align=center >
                           
$data[size]</td>";
         echo 
"<td width=25% align=center >
                           
$data[first]</td>";
         echo 
"<td width=25% align=center >
                           
$data[last]</td></tr>";                                    
     } 
     echo 
'</table>';        
?>        


scan_ftp.php
<?php
  
function scan_ftp($link, $dir) 
  { 
    GLOBAL 
$filename; 
    
// Получаем все файлы корневого каталога 
    // Дескриптор соединения $link получен в config.php 
    
$file_list = ftp_rawlist($link, $dir); 
    
// Выводим содержимое каталога     
    
foreach($file_list as $file) 
    { 
      
// Разбиваем строку по пробельным символам 
      
list($acc, 
           
$bloks, 
           
$group, 
           
$user, 
           
$size, 
           
$month, 
           
$day, 
           
$year, 
           
$file) = preg_split("/[\s]+/", $file); 
      
//Если файл начинается с точки - игнорируем его 
      
if(substr($file, 0, 1) == '.') continue; 
      
// Определяем является ли объект директорией 
      
if(substr($acc, 0, 1) == 'd') 
      { 
        
// Директория 
        
scan_ftp($link, $dir.'/'.$file); 
      } 
      
// Определяем является ли объект файлом 
      
if(substr($acc, 0, 1) == '-') 
      { 
        
// Файл 
        
$filename[] = $file." - ".$dir.'/'.$file; 
        
        
$fileopen = fopen("/home/o/*********/$dir/$file","r");
        if(!
fileopen)
        {
          echo(
"Ошибка открытия файла");
        }
        else
        {
          
$first = fread ($fileopen,63);
          
          if (
$size < 64) $last = $first;
          else
          {          
            
$point = $size - 64;
              
fseek($fileopen, $point);
            
$last = fread ($fileopen,64);
          }
        
fclose($fileopen);
        }        
               
        
// чтение и запись в базу данных
        
if ( get_magic_quotes_gpc() ) 
        {
            
$first = mysql_real_escape_string($first);
            
$last = mysql_real_escape_string($last);
        }
                
        
$query = "insert data 
                      SET name  = '
$file',
                        path  = '/home/o/*********/
$dir/$file',
                        size  =  
$size,
                        first = '
$first',
                        last  = '
$last',
                        time  = now()" 
;
        
        if (!
mysql_query($query))
        {
            echo 
'Ошибка записи в базу данных ';
            echo 
$query.'<br>';
        }
      } 
    } 
  }
?>

  Ответить  
 
 автор: cheops   (07.01.2012 в 14:43)   письмо автору
 
   для: aievengo   (07.01.2012 в 03:01)
 

>а при работе с реальными файлами на сервере при считывании первых и/или последних 64 байт
>возникают проблемы.
А что за проблемы?

        // чтение и запись в базу данных 
        if ( get_magic_quotes_gpc() )  
        { 
            $first = mysql_real_escape_string($first); 
            $last = mysql_real_escape_string($last); 
        }
У вас $first и $last - не от пользователя и не от сервера, их никто не экранирует, поэтому не стоит расчитывать, что режим "магических кавычек" их затронет. Просто экранируйте их без затей
            $first = mysql_real_escape_string($first); 
            $last = mysql_real_escape_string($last); 
Скорее всего проблема именно в этом, особенно, если работа идет в том числе с бинарными файлами.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования