Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Дать добро на закачку файла(php)...? |

25.03.2008, 00:25
|
|
Познающий
Регистрация: 28.02.2008
Сообщений: 49
Провел на форуме: 358989
Репутация:
22
|
|
Дать добро на закачку файла(php)...?
Привет всем...Подскажите плыз как дать добро на закачку файла с Http сервера определенному юзеру...тоесть просто с сайта.Помните скачку с сайтов мп3 ,так там если не зареган, то скрипт те файл не даст скачать...как такое реализовать?Знаю что вродь решается это путем отправки определенных заголовков,но ненаю каких...Подскажите где почитать или так скажите...
|
|
|

25.03.2008, 02:31
|
|
Флудер
Регистрация: 20.11.2006
Сообщений: 3,316
Провел на форуме: 16641028
Репутация:
2371
|
|
Вопрос задан некорректно...
Перед скачкой сделать проверку на регу + если у ссылок прямые ссылки, то сделать их не прямыми с хешем и шифровкой Ip...
|
|
|

25.03.2008, 02:48
|
|
Moderator - Level 7
Регистрация: 24.02.2006
Сообщений: 447
Провел на форуме: 2872049
Репутация:
705
|
|
PHP код:
include 'cdownload.inc.php';
$download = @new cdownload($_request['download']);
$download->enabledcountry = 'localhost,local network,ua,ru';
$download->whitelist = '127.0.0.1,10.1.3.94';
$download->banlist = '184.12.13.5';
$download->username = 'pupkin';
$download->speedlimit = 10;
$download->sizelimit = 2*mb;
$download->downloadfile();
?>
Код класса
# filename: cdownload.inc.php
define('kb',1024);
define('mb',kb*1024);
class cdownload {
# -------------------------------------------------------------------------------------
# Описание : выгрузка файла пользователю с поддержкой докачки и ограничением скорости
# -------------------------------------------------------------------------------------
var $downloadtimelimit = 300; # Лимит времени работы функции выгрузки
var $username = 'anonymous/'; # Пользователь по умолчанию
var $sizelimit = 0; # Лимит объема выгрузки (0 - без ограничений)
var $speedlimit = 5; # Лимит скорости выгрузки, кб/с
var $enablepartial = 1; # Разрешение докачки (0 - запрещена)
var $statfolder = 'stats/'; # Папка расположения статистики
var $filename; # Выгружаемый файл (должен быть задан!)
var $enabledcountry; # Разрешенные страны (список разделенный запятыми,
# null - разрешеные все)
var $disabledcountry; # Запрещенные страны (список разделенный запятыми)
var $whitelist; # Список разрешенных ip-адресов (список разделенный запятыми)
var $banlist; # Список запрещенных ip-адресов (список разделенный запятыми)
var $transferbytes = 0;
function cdownload($filename,$username) {
$this->filename = $filename;
if ($username)
$this->username = ereg_replace('[^0-9a-za-z_\-]','',$username).'/';
$fullpath = $this->statfolder.$this->username;
if (!file_exists($fullpath))
mkdir($fullpath);
} # end cdownload
function verifycountry() {
$usercountry = $this->getcountry($_server['remote_addr']);
if (
($this->enabledcountry && !in_array($usercountry,split(',',$this->enabledcountry))) ||
($this->disabledcountry && in_array($usercountry,split(',',$this->disabledcountry))) ||
($this->whitelist && !in_array($_server['remote_addr'],split(',',$this->whitelist))) ||
($this->banlist && in_array($_server['remote_addr'],split(',',$this->banlist)))
) {
header('http/1.0 403 forbidden');
header('warning: 99# you country or ip address disabled');
exit;
}
}
function downloadfile() {
$this->verifycountry();
$blocksize = 8192;
$headererrortext = 'error! a possible size is exceeded';
$this->username = ereg_replace('[^0-9a-za-z_\-]','',$this->username).'/';
$this->filename = preg_replace('/\.{2}/','',$this->filename);
if (!file_exists($this->filename)) {
header('http/1.0 404 not found');
exit;
}
$fsize = filesize($this->filename);
$ftime = date('d, d m y h:i:s t', filemtime($this->filename));
$fd = @fopen($this->filename, 'rb');
if (!$fd) {
header('http/1.0 403 forbidden');
exit;
}
if ($this->enablepartial && ereg('bytes=([0-9]+)-',$_server['http_range'],$range)) {
header('http/1.1 206 partial content');
$range = $range[1];
fseek($fd, $range);
} else
header('http/1.1 200 ok');
$fullpath = $this->statfolder.$this->username;
$this->transferbytes = file($fullpath.$_server['remote_addr']);
$this->transferbytes = $this->transferbytes[0];
if ($this->sizelimit && $this->transferbytes>$this->sizelimit) {
header('http/1.0 403 forbidden');
header('warning: 99# '.$headererrortext);
exit;
}
$fp = fopen($fullpath.$_server['remote_addr'],'w');
header('content-disposition: attachment; filename='.ereg_replace('^.*/','',$this->filename));
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');
set_time_limit($this->downloadtimelimit);
while (!feof($fd)) {
if ($this->sizelimit && $this->transferbytes>$this->sizelimit) {
header('warning: 99# '.$headererrortext);
exit;
}
echo fread($fd, $blocksize);
$this->transferbytes += $blocksize;
fseek($fp,0);
fwrite($fp,$this->transferbytes);
if ($this->speedlimit)
usleep(8000000/$this->speedlimit);
}
fclose($fp);
fclose($fd);
} # end downloadfile
function getcountry($ip) {
$result = 'unknow';
if (ereg('127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',$ip))
return 'localhost';
if (ereg('10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|191\.168\.[0-9]{1,3}\.[0-9]{1,3}|'.
'172\.16\.[0-9]{1,3}\.[0-9]{1,3}',$ip))
return 'local network';
if ($ip!='') {
$sock = fsockopen('whois.ripe.net',43,$errno,$errstr);
if ($sock) {
fputs ($sock,$ip."\r\n");
while (!feof($sock) && !preg_match('/country:\s*(\s*)/',$buf,$matches))
$buf = fgets($sock,128);
$result = strtoupper($matches[1]);
}
fclose ($sock);
}
return $result;
} # end getcountry
}
?>
посмотри тут http://articles.org.ru/ контролируемая отдача файлов
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|