Как запретить прямое скачивания файлов с сервера?

Discussion in 'PHP' started by ZnikiR, 26 Apr 2010.

  1. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Интересует система , которая выдает ссылку для скачивания каждому пользователю отдельно.
    И делает невозможным прямое скачивание с сервака.
    Короче я узнал это называется анитилич.

    Короче хочу сделать следующее.
    Пользователь вводит данные. сверяем с данными в mysql.
    то он переходит на страницу скачки файла,которая действует с этого момента 2 часа.

    Пожалуйста как запретить прямой доступ к файлу,а выдавать его через php скрипт?
    Ну с использованием htaccess
     
    #1 ZnikiR, 26 Apr 2010
    Last edited: 26 Apr 2010
  2. XPYMGT

    XPYMGT New Member

    Joined:
    11 Apr 2009
    Messages:
    34
    Likes Received:
    3
    Reputations:
    0
    На папку с файлами ставишь дени фром лол, а сами файлы для скачки считываешь в бинарном режиме отправляешь заголовки и выводишь в браузер
     
  3. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    1)как много это будет хавать ресурсов?
    2)Пример можно в студию (а то у меня опыта работы с htaccess вообще нет)
    вот я нашел тут скрипт,но он печает содержимое страницы.
    а как сделать чтобы он давал на сохранение?
    PHP:
    <?php



    // Настройки

    $antiurl "sup.local";               // Разрешённые сайты (referer).
    $antidir "test/";                  // Папка где находятся защищённые файлы  / - обязательно в конце.
    $logfile "log.htm";              // Eсли хотите вести лог удалите // перед строкой. Файл логов (должен быть html или htm и обязательно CHMOD 777.


    // Логи

    if (isset($logfile)) {
    if (!
    file_exists($logfile)) die("Файл <font color='red'><b>$logfile</b></font> не найден!");
    if (!
    is_writable($logfile)) die("Для файла <font color='red'><b>$logfile</b></font> нужно зделать CHMOD 777!");
    $cnr_date date("l d F H:i:s");
    $cnr_counter $logfile;
    $cnr_fp fopen($cnr_counter"a");
    $cnr_hostname gethostbyaddr($_SERVER['REMOTE_ADDR']);
    if (
    $_SERVER['HTTP_REFERER'] == "")
    $cnr_ref "BLOCKED"; } else { $cnr_ref "<a href=\"" $_SERVER['HTTP_REFERER'] . "\">" $_SERVER['HTTP_REFERER'] . "</a>";}
    $cnr_data "<font color=\"green\">" $_SERVER['REMOTE_ADDR'] . "</font> HOST <font color=\"red\">" $cnr_hostname "</font> visited on " $cnr_date " linked by " $cnr_ref " <br>";
    fputs($cnr_fp$cnr_data);
    fclose($cnr_fp); }

    // Проверка реферера



    if (is_numeric($_GET["down"]))
    {
    /************НАЧАЛО ФАЙЛОВ***************************************************************************/

        // Здесь идут файлы для скачивания

        
    if ($_GET["down"] == 1)
            
    $filename "test.rar";



    /************КОНЕЦ ФАЙЛОВ***************************************************************************/

        //Находим окончание файла

        
    $splitexplode("."$filename);
        
    $textcountsubstr_count($filename".")+1//
        
    $ttype =$split[$nextcount];

        
    // Создается ссылка на файл

        
    $path $antidir $filename ;


        
    // Проверка файла есть он или нет

        
    if (!file_exists($path)) {

            echo 
    "Файл '$filename' не существует.";
            echo 
    $c;
            exit;                }

        
    $ftime date("D, d M Y H:i:s T"filemtime($path));

    }
      
        
    // Проверка


        
    if (isset($_GET['down']) && isset($filename)) {

        
    $fsize filesize($path);
        
    $ftime date("D, d M Y H:i:s T"filemtime($path));
        
    $fd = @fopen($path"rb");
        if (!
    $fd){
          
    header ("HTTP/1.0 403 Forbidden");
          exit;
        }


        if (
    $HTTP_SERVER_VARS["HTTP_RANGE"]) {
          
    $range $HTTP_SERVER_VARS["HTTP_RANGE"];
          
    $range str_replace("bytes="""$range);
          
    $range str_replace("-"""$range);
          if (
    $range) {fseek($fd$range);}
        }
        
    $content fread($fdfilesize($path));
        
    fclose($fd);
        if (
    $range) {
          
    header("HTTP/1.1 206 Partial Content");
        }
        else {
          
    header("HTTP/1.1 200 OK");
        }
        
    header("Content-Disposition: attachment; filename=" basename($path));
        
    header("Last-Modified: $ftime");
        
    header("Accept-Ranges: bytes");
        
    header("Content-Length: ".($fsize-$range));
        
    header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
        
    header("Content-type: application/octet-stream");
        print 
    $content;
        exit;

        } else { echo 
    "Недействительный файл."; echo $c; } 


     exit;

    ?>
     
    #3 ZnikiR, 26 Apr 2010
    Last edited: 26 Apr 2010
  4. XPYMGT

    XPYMGT New Member

    Joined:
    11 Apr 2009
    Messages:
    34
    Likes Received:
    3
    Reputations:
    0
    Код не смотрел по 4 кб в цикле читаешь и выводишь, итого расход памяти: 250кб с хуем + 4 кб.

    order allow,deny
    deny from all

    В папку с файлами.
    Название всех файлов в базе. Скачка download.php?id=xxx, в базе смотрим название файла... Вообщем долго рассказывать, посмотри функции для работы с файловой системой.
     
  5. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием


    <?php
    header('Content-type: file');
    header('Content-Disposition: attachment; filename="$_REQUEST[file]"');
    readfile("$_REQUEST['file']");
    ?>

    вызываешь его вот так

    http://site.ru/script.php?file=index.php

    предложит скачать файл индекс
     
  6. XPYMGT

    XPYMGT New Member

    Joined:
    11 Apr 2009
    Messages:
    34
    Likes Received:
    3
    Reputations:
    0
    Угу, зачем плохому учишь?
     
  7. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    код выложил 440hz на форуме php.ru поддерживает докачку ...

    PHP:
    <?php

    /**
     * @author 440hz
     * @copyright 2007
     */
     
     
    session_start();

    require_once (
    'includes/config.php');

    if (isset(
    $_GET['id'])) 
    {
    //ID файла в базе
        
    if (isset($_SESSION['level']) && $_SESSION['level'] === '2'
        { 
    // Проверка уровня пользователя

    //Просим БД дать нам имя файла по его ID
            
    $res $db->mysql_qw('SELECT `name`,`cat` FROM `video` WHERE `id`=?'$_GET['id']) or
                die();
            
    $fetch $db->mysql_fetch($res);

            
    // отдаваемое файло
            
    $filename 'movie/' $fetch['cat'] . '/' $fetch['name'];

            
    // есл файла нет
            
    if (!file_exists($filename)) {
                
    header("HTTP/1.0 404 Not Found");
                exit;
            }

            
    // получим размер файла
            
    $fsize filesize($filename);
            
    // дата модификации файла для кеширования
            
    $ftime date("D, d M Y H:i:s T"filemtime($filename));
            
    // смещение от начала файла
            
    $range 0;

            
    // пробуем открыть
            
    $handle = @fopen($filename"rb");

            
    // если не удалось
            
    if (!$handle) {
                
    header("HTTP/1.0 403 Forbidden");
                exit;
            }

            
    // Если запрашивающий агент поддерживает докачку
            
    if ($_SERVER["HTTP_RANGE"]) {
                
    $range $_SERVER["HTTP_RANGE"];
                
    $range str_replace("bytes="""$range);
                
    $range str_replace("-"""$range);
                
    // смещаемся по файлу на нужное смещение
                
    if ($range) {
                    
    fseek($handle$range);
                }
            }

            
    // если есть смещение
            
    if ($range) {
                
    header("HTTP/1.1 206 Partial Content");
            } else {
                
    header("HTTP/1.1 200 OK");
            }

            
    header("Content-Disposition: attachment; filename=\"{$filename}\"");
            
    header("Last-Modified: {$ftime}");
            
    header("Content-Length: " . ($fsize $range));
            
    header("Accept-Ranges: bytes");
            
    header("Content-Range: bytes {$range}-" . ($fsize 1) . "/" $fsize);

            
    // подправляем под IE что б не умничал
            
    if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],
                
    'MSIE'))
                
    Header('Content-Type: application/force-download');
            else
                
    Header('Content-Type: application/octet-stream');

            while (!
    feof($handle)) {
                
    $buf fread($handle512);
                print (
    $buf);
            }

            
    fclose($handle);

        } else {
            
    header("HTTP/1.0 403 Forbidden");
            exit;
        }
    } else {
        
    header("HTTP/1.0 403 Forbidden");
        exit;
    }

    ?>
     
  8. Deathdreams

    Deathdreams Elder - Старейшина

    Joined:
    8 Nov 2008
    Messages:
    342
    Likes Received:
    116
    Reputations:
    5
    Code:
    
    function downloadFile($filename, $mimetype='application/octet-stream') {
    	if (!file_exists($filename)) die('Файл не найден');
    
    	$from=$to=0; $cr=NULL;
    
    	if (isset($_SERVER['HTTP_RANGE'])) {
    		$range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1);
    		$from=strtok($range, '-');
    		$to=strtok('/'); if ($to>0) $to++;
    		if ($to) $to-=$from;
    		header('HTTP/1.1 206 Partial Content');
    		$cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):filesize($filename));
    	} else	header('HTTP/1.1 200 Ok');
    
    	$etag=md5($filename);
    	$etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8);
    	header('ETag: "' . $etag . '"');
    
    	header('Accept-Ranges: bytes');
    	header('Content-Length: ' . (filesize($filename)-$to+$from));
    	if ($cr) header($cr);
    
    	header('Connection: close');
    	header('Content-Type: ' . $mimetype);
    	header('Last-Modified: ' . gmdate('r', filemtime($filename)));
    	$f=fopen($filename, 'r');
    	header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
    	if ($from) fseek($f, $from, SEEK_SET);
    	if (!isset($to) or empty($to)) {
    		$size=filesize($filename)-$from;
    	} else {
    		$size=$to;
    	}
    	$downloaded=0;
    	while(!feof($f) and !connection_status() and ($downloaded<$size)) {
    		echo fread($f, 512000);
    		$downloaded+=512000;
    		ob_flush(); 
    		flush();
    	}
    	fclose($f);
    }
    
    Функция закачки файла с поддержкой докачки.