![]() |
Показаны 8 сообщений на этой странице |
Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Безопастность файлов ! (http://netadmin.ws/forum/showthread.php?threadid=9172)
Безопастность файлов !
Помогите пожалуйста найти безопастный построения ссылок на файлы с разширением (*.exe;*.jpg) расположенные на сервере. Например что-бы вместо http://host/files/1.exe писать, http://host/downloads.php?id=($id)! Чтоб id номер этого файла можно было задавать в этом-же, или отдельном файле ! Примерно так-же как это делается с php файлами:
<?php
switch ($page)
{
case home:
include("home.php");
break;
default:
include("news.php");
break;
}
?>
$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));
__________________
Всегда есть решение.
И как это работает ? Если можно, то поподробнее ! Плиизззз !
а ты измени переменные $filename - имя файла $path - путь до файла и зпусти в браузере, увидишь как работает.
__________________
Всегда есть решение.
Нет это не то !
Я нащёл подходящее, но есть ещё одна проблема ! Имея этот скрипт, для каждого каталога надо создавать отдельный файл ! Можно ли сделать так, чтобы проверялось сразу-же несколько дирректорий, и определённая директория задавалась определённым id! Например вот так:
http://nd4spd.ovl.ru/downloads.php?id=1&name=1.exe
Где id1=files - папка, а 1.exe - файл расположенный тут в папке id1/1.exe (files/1.exe)
Вот что я переделал, но не работатет !
<?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;
?>
Ты спрашивал как передать файл юзеру, я ответил. А вот как создавать путь до файла и где хранить данные это совсем другой вопрос. Возми хотябы взгляни на доку по пхп, особо обрати внимание на массивы. Ну да ладно, если хочешь могу тебе пример дать:
/* вот пример массива
$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));
__________________
Всегда есть решение.
C файлами я разобрался, а как изображения сделать 
И как можно защитить страницу, от просмотра html кода ?
| Формат времени GMT. Текущее время 11:50. | Показаны 8 сообщений на этой странице |
Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.