Просмотр полной версии : Как запретить прямое скачивания файлов с сервера?
Интересует система , которая выдает ссылку для скачивания каждому пользователю отдельно.
И делает невозможным прямое скачивание с сервака.
Короче я узнал это называется анитилич.
Короче хочу сделать следующее.
Пользователь вводит данные. сверяем с данными в mysql.
то он переходит на страницу скачки файла,которая действует с этого момента 2 часа.
Пожалуйста как запретить прямой доступ к файлу,а выдавать его через php скрипт?
Ну с использованием htaccess
На папку с файлами ставишь дени фром лол, а сами файлы для скачки считываешь в бинарном режиме отправляешь заголовки и выводишь в браузер
1)как много это будет хавать ресурсов?
2)Пример можно в студию (а то у меня опыта работы с htaccess вообще нет)
вот я нашел тут скрипт,но он печает содержимое страницы.
а как сделать чтобы он давал на сохранение?
<?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";
/************КОНЕЦ ФАЙЛОВ************************************** *************************************/
//Находим окончание файла
$split= explode(".", $filename);
$textcount= substr_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($fd, filesize($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;
?>
Код не смотрел по 4 кб в цикле читаешь и выводишь, итого расход памяти: 250кб с хуем + 4 кб.
order allow,deny
deny from all
В папку с файлами.
Название всех файлов в базе. Скачка download.php?id=xxx, в базе смотрим название файла... Вообщем долго рассказывать, посмотри функции для работы с файловой системой.
дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием
<?php
header('Content-type: file');
header('Content-Disposition: attachment; filename="$_REQUEST[file]"');
readfile("$_REQUEST['file']");
?>
вызываешь его вот так
http://site.ru/script.php?file=index.php
предложит скачать файл индекс
дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием
<?php
header('Content-type: file');
header('Content-Disposition: attachment; filename="$_REQUEST[file]"');
readfile("$_REQUEST['file']");
?>
вызываешь его вот так
http://site.ru/script.php?file=index.php
предложит скачать файл индекс
Угу, зачем плохому учишь?
код выложил 440hz на форуме php.ru поддерживает докачку ...
<?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($handle, 512);
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);
}
Функция закачки файла с поддержкой докачки.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot