Форум сетевых администраторов
Показаны 8 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Безопастность файлов ! (http://netadmin.ws/forum/showthread.php?threadid=9172)


Помещено TAPAKAH7 19-07-2004 в 15:57:

Безопастность файлов !

Помогите пожалуйста найти безопастный построения ссылок на файлы с разширением (*.exe;*.jpg) расположенные на сервере. Например что-бы вместо http://host/files/1.exe писать, http://host/downloads.php?id=($id)! Чтоб id номер этого файла можно было задавать в этом-же, или отдельном файле ! Примерно так-же как это делается с php файлами:

code:

<?php 
switch ($page)
{
case home:
include("home.php");
break;
default:
include("news.php");
break;
}
?>


Всё это похоже на то, как это делает форум с прикреплёнными рисунками и файлами ! Но я не понимаю как такое воплотить в реальность, из-за того что с PHP я знаком на 0.01% !
Помогите пожалуйста! Очень нужно !


Помещено polo 20-07-2004 в 07:47:


PHP:


$filename 
= 'file.ext';
$path = 'path_to_file/';
        
header("Cache-control: private");
        
header("Content-type: application/force-download");
        
header("Content-transfer-encoding: binary\n");
        
header("Content-disposition: attachment; filename=\"$filename\"");
        
header("Content-Length: ".filesize($path . $filenmae));

__________________
Всегда есть решение.


Помещено TAPAKAH7 20-07-2004 в 09:38:

И как это работает ? Если можно, то поподробнее ! Плиизззз !


Помещено polo 20-07-2004 в 13:11:

а ты измени переменные $filename - имя файла $path - путь до файла и зпусти в браузере, увидишь как работает.

__________________
Всегда есть решение.


Помещено TAPAKAH7 20-07-2004 в 17:06:

Нет это не то !
Я нащёл подходящее, но есть ещё одна проблема ! Имея этот скрипт, для каждого каталога надо создавать отдельный файл ! Можно ли сделать так, чтобы проверялось сразу-же несколько дирректорий, и определённая директория задавалась определённым id! Например вот так:

http://nd4spd.ovl.ru/downloads.php?id=1&name=1.exe

Где id1=files - папка, а 1.exe - файл расположенный тут в папке id1/1.exe (files/1.exe)

Вот что я переделал, но не работатет !


code:

<?php

$page[url_1] = "programs";
$page[url_2] = "nfsu2/programs";
$page[url_3] = "nfsu/programs";

  $fn = $HTTP_GET_VARS['name'];

  if(strstr($fn, '/'))
  {
    // небольшая защита от попыток закачки из других каталогов
    header($HTTP_SERVER_VARS['SERVER_PROTOCOL'] . ' 403 Forbidden');
    exit;
  }
  $theu = "url"."_"."$id";
  $filename = './$page[$theu]/' . $fn;
  if(!file_exists($filename))
  {
    header($HTTP_SERVER_VARS['SERVER_PROTOCOL'] . ' 404 Not Found');
    exit;
  } 

  $fsize = filesize($filename);
  $ftime = date('D, d M Y H:i:s T', filemtime($filename));
  $fd = @fopen($filename, 'rb');
  if(!$fd)
  {
    header($HTTP_SERVER_VARS['SERVER_PROTOCOL'] . ' 403 Forbidden');
    exit;
  }

  // Если запрашивающий агент поддерживает докачку, то
  // с запросом он отсылает кол-во скаченных байт
  if( isset($HTTP_SERVER_VARS['HTTP_RANGE']) )
  {
    $range = $HTTP_SERVER_VARS['HTTP_RANGE'];
    $range = str_replace('bytes=', '', $range);
    $range = intval($range);
    if($range)
      fseek($fd, $range);
  }
  $content = fread($fd, $fsize);
  fclose($fd);
  
  if($range)
    header($HTTP_SERVER_VARS['SERVER_PROTOCOL'] . ' 206 Partial Content');
  else
    header($HTTP_SERVER_VARS['SERVER_PROTOCOL'] . ' 200 OK');

  // для Opera и Explorer'а отдаем отдельный заголовок
  if( ereg('Opera(/| )([0-9].[0-9]{1,2})', $HTTP_SERVER_VARS['HTTP_USER_AGENT'], $log_version) ||
      ereg('MSIE ([0-9].[0-9]{1,2})', $HTTP_SERVER_VARS['HTTP_USER_AGENT'], $log_version)
    )
  {
    header('Content-Disposition: inline; filename=' . $fn);
    header('Content-Type: application/octetstream');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
  }
  else
  {
    header('Content-Disposition: attachment; filename=' . $fn);
    header('Content-Type: application/octet-stream');
    header('Pragma: no-cache');
  }
  header('Last-Modified: ' . $ftime);
  header('Accept-Ranges: bytes');
  header('Content-Length: ' . ($fsize-$range));
  header('Content-Range: bytes ' . $range . '-' . ($fsize-1) . '/' . $fsize);
  header('Expires: 0');
  print $content;
  exit;

?>


<<<--->>>


Помещено polo 21-07-2004 в 19:11:

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

PHP:


/* вот пример массива
$files = array(
    'fileid' = array(
            'file_path' => 'file_path',
            'file_name' = 'file_name'
            )
    );
*/

// далее создаем массив с нужными файлами
$files = array(
    
'1' = array(
            
'file_path' => '/home/files',
            
'file_name' = 'file1.rar'
            
),
    
'2' = array(
            
'file_path' => '/home/files/tmp',
            
'file_name' = 'file2.rar'
            
)
    );
    
// Далее предположим что хотят скачать файл 2, и обращяются по url download.php?id=2

// тогда мы получаем нужный нам путь к файлу и сам файл
// но сначало не забываем проверить правилен ли указанный id

if (!isset($files[$_GET['id']]))
{
    echo 
"Такой файл не существует";
    exit;
}

$file_name = $files[$_GET['id']]['file_name'];
$file_path = $files[$_GET['id']]['file_path'];
$full_path = $file_path . '/' . $file_name;

// далее делаем нужные на манипуляции по передаче файла юзверю

header("Cache-control: private"); 
header("Content-type: application/force-download"); 
header("Content-transfer-encoding: binary\n"); 
header("Content-disposition: attachment; filename=\"$file_name\""); 
header("Content-Length: ".filesize($full_path));

__________________
Всегда есть решение.


Помещено TAPAKAH7 22-07-2004 в 13:49:

C файлами я разобрался, а как изображения сделать


Помещено TAPAKAH7 23-07-2004 в 05:03:

И как можно защитить страницу, от просмотра html кода ?


Формат времени GMT. Текущее время 11:50.
Показаны 8 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.