Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] загрузка файлов на сервер (http://forum.oszone.net/showthread.php?t=271861)

zvezda_t 12-11-2013 08:02 2252550

загрузка файлов на сервер
 
Скажите, пожалуйста - как правильно файлы на сервер грузить?
Должна ли быть директория загрузки - выше корневого каталога?
Какие права на каталог нужно установить?
Каким образом можно вывести фото в тег img и при этом не позволить злоумышленникам по прямой ссылке файлы доставать?

Habetdin 12-11-2013 21:26 2253180

Цитата:

Цитата zvezda_t
Каким образом можно вывести фото в тег img и при этом не позволить злоумышленникам по прямой ссылке файлы доставать? »

Защита фото от хотлинкинга - есть много способов =)
Цитата:

Цитата zvezda_t
Должна ли быть директория загрузки - выше корневого каталога? »

А зачем вам там файлы? Судя по вопросам, будут грузится изображения - значит можно запретить выполнение скриптов для директории загрузки (а еще лучше - не давать загружать их в своем скрипте) и все будет нормально.
Пример .htaccess для папки с загруженными файлами
Запрет популярных форматов скриптов/html-файлов:
Код:

<FilesMatch "\.([Pp][Hh][Pp]|[Cc][Gg][Ii]|[Pp][Ll]|[Ph][Hh][Tt][Mm][Ll])\.?">
  Order allow,deny
  Deny from all
</FilesMatch>

Радикальный метод - запрет всего и разрешенные изображения :)
Код:

<FilesMatch ".*">
  Order allow,deny
  Deny from all
</FilesMatch>

<FilesMatch "\.(jpg|jpeg|gif|png)$|^$">
  Order deny,allow
  Allow from all
</FilesMatch>


zvezda_t 13-11-2013 07:33 2253417

Цитата:
Habetdin
, спасибо Вам большое за ответ)

Я немного не точно выразилась. Дело в том, что мне необходимо защитить документы от злоумышленников, не в том смысле - чтоб они их скачать себе не смогли, но чтобы даже и посмотреть не смогли.

То есть, если пользователь авторизовался на сайте - то он получает доступ к просмотру и скачиванию документов, а если пользователь на сайте не авторизовался - он не в коем случае не может ни фото посмотреть, не себе скачать - ничего не должен видеть.

А сейчас у меня так: если пользователь вышел с сайта, но знает путь до документов + название документа - его ничего не остановит от просмотра или скачивания - так как ссылка прямая.

Цитата:
А зачем вам там файлы? Судя по вопросам, будут грузится изображения
Это пока единственное, что я придумала - чтоб запретить прямую ссылку к файлам - без авторизации. Ведь если файлы в директории выше корневой - к ним никак не добраться?
Если не получиться отображать изображения в теге <img> - из директории выше корневой - то придется пожертвовать отображением - ради безопасности. Фото тогда будет выгружаться как и другие документы с помощью функций php.

Вот, надеюсь не запутала Вас? Что посоветуете?

Habetdin 14-11-2013 01:05 2254118

zvezda_t, можно тогда полностью "закрыть" папку от просмотра через веб:
Код:

Order allow,deny
Deny from all

А файлы отдавать своим внутренним скриптом, который знает, авторизован ли пользователь. Как я понял,
Цитата:

Цитата zvezda_t
с помощью функций php »

Пример на PHP (спойлер)
PHP код:

<?php
function imDownload($file_path// функция, отдающая файл $file_path в браузер. при использовании в виде "i.php?img=scr.png" не забывайте фильтровать входящее имя файла, а то можно будет посмотреть не только изображения при наличии авторизации ;)
{
    
$file_path realpath($file_path);
    
$file_info pathinfo($file_path);
    switch(
$file_info['extension']) {
        case 
'gif'$file_mime 'image/gif'; break;
        case 
'png'$file_mime 'image/png'; break;
        case 
'jpe': case 'jpeg':
        case 
'jpg'$file_mime 'image/jpg'; break;
        default: 
$file_mime 'application/octet-stream';
    }
    
    if(
file_exists($file_path))
    {
        
// можно раскомментировать следующую строку, если нужно поведение "загружаемого файла"
        // header('Content-Disposition: attachment; filename='. $file_info['basename']);
        
header('Content-Transfer-Encoding: binary');
        
header('Content-Length: 'filesize($file_path));
        
header('Content-Type: '$file_mime);
        
header('Cache-Control: must-revalidate');
        
header('Cache-Control: private'false);
        
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        
header('Pragma: no-cache');
        
ob_clean(); flush();
        
readfile($file_path);
        exit();
    }
    else
        die(
'No such file');
}
// некий пример со статическим именем файла :)
if($authimDownload('private_folder/Image_2013-10-03_003.png'); // если есть авторизация - отдаем юзеру файл


Реальный путь до файла при этом не будет выдан - пользователь увидит адрес скрипта. И даже с известным путем нельзя будет скачать файл без доступа к серверу, папка то закрыта для просмотра через web ;)

zvezda_t 14-11-2013 10:03 2254246

Спасибо.
Почитала по ссылке. Вы же про эту статью - да?
Можно не только файлы фото так прятать - но и любые файлы - Да?
Я только не поняла - как туда зависимость от авторизации прикрутить? Или это не та ссылка?

Вот, например, сейчас у меня доки в папке:
http://my_site.ru/clients/1/ivanov.doc

Если авторизованный или не авторизованный пользователь, пробует зайти так:
http://my_site.ru/clients/1/

Выходит ошибка:
Цитата:

404 Page Not Found
The page you requested was not found.
Это хорошо)

А если пользователь вышел из системы и нажимает:
http://my_site.ru/clients/1/ivanov.doc
- то никаких запретов нет - скачивай пожалуйста (((

Habetdin 15-11-2013 02:50 2254916

Цитата:

Цитата zvezda_t
Или это не та ссылка? »

Защита от хотлинкинга - это защита от встраивания ваших изображений на чужих сайтах. Думал в начале темы о том, что вам нужно именно это.
Цитата:

Цитата zvezda_t
зависимость от авторизации прикрутить? »

Выдавайте файл скриптом, а не прямую ссылку на файл. А папку с файлами закройте от просмотра через веб, с помощью .htaccess из 4 поста.

zvezda_t 15-11-2013 08:00 2254958

Цитата:

Цитата Habetdin
Выдавайте файл скриптом, а не прямую ссылку на файл. »

Спасибо, я так и хочу!

Цитата:

Цитата Habetdin
А файлы отдавать своим внутренним скриптом, который знает, авторизован ли пользователь. Пример на php:
читать дальше » »

Что это за пример на php? Отправьте, пожалуйста еще раз ссылку - эта не та.


Время: 08:23.

Время: 08:23.
© OSzone.net 2001-