Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Как запретить прямое скачивания файлов с сервера? (https://forum.antichat.xyz/showthread.php?t=199445)

ZnikiR 26.04.2010 17:35

Как запретить прямое скачивания файлов с сервера?
 
Интересует система , которая выдает ссылку для скачивания каждому пользователю отдельно.
И делает невозможным прямое скачивание с сервака.
Короче я узнал это называется анитилич.

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

Пожалуйста как запретить прямой доступ к файлу,а выдавать его через php скрипт?
Ну с использованием htaccess

XPYMGT 26.04.2010 20:02

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

ZnikiR 26.04.2010 20:27

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;

?>


XPYMGT 26.04.2010 23:05

Код не смотрел по 4 кб в цикле читаешь и выводишь, итого расход памяти: 250кб с хуем + 4 кб.

order allow,deny
deny from all

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

dr.Web 27.04.2010 11:12

дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием


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

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

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

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

XPYMGT 27.04.2010 13:44

Цитата:

Сообщение от dr.Web
дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием


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

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

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

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

Угу, зачем плохому учишь?

Doom123 27.04.2010 14:02

код выложил 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;
}

?>


Deathdreams 27.04.2010 14:12

Код:


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);
}

Функция закачки файла с поддержкой докачки.


Время: 12:09