Paralelny download, blokovanie, kontrola

Programovacie jazyky, rady, poradňa...
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Paralelny download, blokovanie, kontrola

Príspevok od používateľa Shakal »

Zdravim.
Chcem sa spytat na nasledovne:

- zo servera sa cez php skript stahuju subory
- ako zabezpecit aby ked niekto bude stahovat zo servera nejaky fajl - nedovolilo mu to paralelne stahovat iny, popripade ten isty viac-krat (download acceleratory) ?

Inak polozena otazka: Existuje nejaky sposob na strane PHP, ktorym zistim ci uz neprebieha z nejakeho pocitaca nejaky download?

Napr: rapidshare.com vo Free verzii nedovoluje paralelne stahovat subory. A server vie kedy subor stahujem a kedy naopak stahovanie prerusim... .

Vdaka za akukolvek radu, tips, info...
neppo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 774
Registrovaný: 09 jún 2005, 15:33

Príspevok od používateľa neppo »

mna napada jedine to ze si budes zaznamenavat do databazy ktora IP co stahuje. a neskor si uz len pri stahovani budes overovat ci dana IP adresa nieco nestahuje. pripadne si pomoz s Cookies (aj ked neefektivne pokial ich niekto maze) a pri kliknuti na download vytvori cookie subor ktory bude obsahovat nejake udaje a podla nich sa bude tiez overovat ci uz nieco stiahol/stahuje dana IP
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Príspevok od používateľa Shakal »

neppo napísal:a neskor si uz len pri stahovani budes overovat ci dana IP adresa nieco nestahuje
Ako?
Ako viem zistit ci dana IP vobec este nieco stahuje?

Samozrejme, mozem nastavit obmedzenu zivotnost zaznamu v DB o stahovani. Ale co ak clovek este nieco BUDE stahovat a tymto mu prakticky povolim stahovanie dalsie?
neppo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 774
Registrovaný: 09 jún 2005, 15:33

Príspevok od používateľa neppo »

www.stranka.sk/download.php?id=12[code]<?
...
$IP = getenv("REMOTE_ADDR");
$go = FALSE;

$db_connect = @mysql_connect($db_host, $db_user, $db_pass);
$db_select = @mysql_select_db($db_name);
//skontroluje ci dana IP nestahuje
$check_ip = mysql_query("select IP from download_restrict where IP = '".$IP."');
if (mysql_num_rows($check_ip) == 0) {
mysql_query("insert into download_restrict (IP) values ('".$IP."')");
$go = TRUE;
}
if ($go)
$dl = mysql_query("select file_name from download where id = '".$_GET['id']."');
$file = mysql_fetch_array($dl);
header("Location: ".$file['file_name']);
}
...
?>
[/code]za chyby sa ospravedlnujem, pisal som to z hlavy :(
"J"
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1019
Registrovaný: 13 mar 2007, 17:10

Príspevok od používateľa "J" »

Neppo: ak som spravne pochopil tvoj kod, tak akonahle raz nieco stiahne, uz nebude moct nikdy nic stiahnut. V tvojom kode totiz nikde data z tabulky download_restrict nemazes, co by sa malo, ked sa subor dostahuje, a to je zrejme to, co Shakal chce. :)

Shakal: ja by som to riesil prostym obmedzenim "1 subor za trebars 120 minut", to uz spravis jednoducho.
neppo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 774
Registrovaný: 09 jún 2005, 15:33

Príspevok od používateľa neppo »

[quote=""J""]Neppo: ak som spravne pochopil tvoj kod, tak akonahle raz nieco stiahne, uz nebude moct nikdy nic stiahnut. V tvojom kode totiz nikde data z tabulky download_restrict nemazes, co by sa malo, ked sa subor dostahuje, a to je zrejme to, co Shakal chce. :)

Shakal: ja by som to riesil prostym obmedzenim "1 subor za trebars 120 minut", to uz spravis jednoducho.[/quote]staci ked si precitas jeho post co pisal nad tym kodom. on chcel vediet ze ako zisti ci niekto nieco stahuje a ze si to potom osetri
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Príspevok od používateľa Shakal »

Jasne toto chapem ale myslel som teraz tu kontrolu.
Predstav si, ze:

- zacnem tahat nejaky fajl za pomoci tohto skriptu
- do DB sa zanesie zaznam s mojou IP
- subor o velkosti cca 500MB ale nedostahujem. Prerusim stahovanie niekde za 5 MBajtom.

Otazka z toho plynuca:
Ako ten tvoj PHP skript (alebo aj iny) zisti, ze uz nic nestahujem? Aj ked zaznam v DB bude tvrdit nieco ine?

//autoeditácia príspevku ( 02 Jan 2009, 14:53 )
Uz som mozno prisiel na ciastocne riesenie.

Ale stale mi vrta v hlave ako zabranit viac-pocetnemu stahovaniu jedneho fajlu (zakazat web-download-akceleratory).

Uz som vyriesil aj to :D
programator
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 18 apr 2005, 8:31
Bydlisko: Papua new Guinea
Kontaktovať používateľa:

Príspevok od používateľa programator »

Myslim, ze riesenie by bolo pouzitim .htaccess suborov. Pricom ak sa bude pozadovat nejaky subor, pozries do DB, ak neexistuje dana IP, zapises ju. Horsie je to, ak uzivatel stahovanie prerusi. Myslim ze jedina moznost by bolo pernamentne napr. kazdych 30s kontrolovat, ci dana osoba urceny subor stahuje (myslim ze takto sa riesi aj status na forach, pokial uzivatel nebol aktivny po urcitu dobu, oznaci sa ako "odhlaseny").

Pomocou .htaccess suborov jednoducho dokazes poziadavku o nejaky subor presmerovat na php script, ktory vsetky tieto akcie obsluzi a vrati pozadovane data.
mspeedo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 943
Registrovaný: 15 feb 2005, 14:10
Bydlisko: Nitra
Kontaktovať používateľa:

Príspevok od používateľa mspeedo »

Mam na stranke nejaky download script.. ked das nieco tahat, ide ti to len jednym vlaknom. Mozes si na mojom webe skusit stiahnut daku mp3 a ak je to to co chces, hodim ti sem zdrojak.
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Príspevok od používateľa Shakal »

mspeedo napísal:Mam na stranke nejaky download script.. ked das nieco tahat, ide ti to len jednym vlaknom. Mozes si na mojom webe skusit stiahnut daku mp3 a ak je to to co chces, hodim ti sem zdrojak.
Poprosim ta. Rad si to pozriem.
mspeedo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 943
Registrovaný: 15 feb 2005, 14:10
Bydlisko: Nitra
Kontaktovať používateľa:

Príspevok od používateľa mspeedo »

Tu to mas:

Kód: Vybrať všetko

<?php
#####################################
# download.php
# 
# This File Does Not Need To Be Edited!
#####################################
session_start();
require_once "config.php";
require_once "functions.php";
$id=$_GET['id'];
if (ini_get('zlib.output_compression'))
    {
    ini_set('zlib.output_compression', 'Off');
    }
if (!$id)
    {
    echo "No download file specified.";
    exit;
    }
$ip=getenv("REMOTE_ADDR");
$browser=getenv("HTTP_USER_AGENT");
$time=date("Y-m-d H:i:s");
mysql_connect("$dbhost", "$dbuser", "$dbpasswd") or die("Unable to connect to database.");
mysql_select_db("$dbname") or die("Unable to select database.");
$bots=mysql_query("SELECT d2 FROM cns_data WHERE type= '3'");
while ($r=mysql_fetch_array($bots))
	{
	if (stristr($browser,$r['d2']))
       {
       $bot = true;
       }
	}
$sql=mysql_query("SELECT addy FROM $tbl_files WHERE id = $id");
$r=mysql_fetch_array($sql);
$filename=$r['addy'];

$sql2=mysql_query("SELECT time FROM $tbl_stats WHERE id = $id AND ip = '$ip'");
$todaytime=strtotime($time);
while ($r=mysql_fetch_array($sql2))
   	{
	$prevtime= strtotime($r["time"]);
	$timediff=$todaytime - $prevtime;
	if ($timediff<300)
		$addtostats=1;
	}

if ($bot == false && empty($addtostats))
    {
    $sql
        =mysql_query(
             "INSERT INTO $tbl_stats VALUES ('', '$id', '', '', '$ip', '$browser', '$time', '')");
    if ($sql)
        {
        $update=mysql_query("UPDATE $tbl_files SET cnt = cnt+1 WHERE id = $id");
        if ($update)
            {
            $file_extension=strtolower(substr(strrchr($filename, "."), 1));
            switch ($file_extension)
                {
                case "pdf":
                    $ctype="application/pdf";
                    break;
                case "exe":
                    $ctype="application/octet-stream";
                    break;
                case "zip":
                    $ctype="application/zip";
                    break;
                case "doc":
                    $ctype="application/msword";
                    break;
                case "xls":
                    $ctype="application/vnd.ms-excel";
                    break;
                case "ppt":
                    $ctype="application/vnd.ms-powerpoint";
                    break;
                case "gif":
                    $ctype="image/gif";
                    break;
                case "png":
                    $ctype="image/png";
                    break;
                case "jpeg":
                case "jpg":
                    $ctype="image/jpg";
                    break;
                default:
                    $ctype="application/force-download";
                }
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: $ctype");
            header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\";");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: " . filesize($filename));
            readfile("$filename");
            exit();
            }
        else
            {
            echo mysql_error();
            }
        }
    else
        {
        echo mysql_error();
        }
    }
else
			{
            $file_extension=strtolower(substr(strrchr($filename, "."), 1));
            switch ($file_extension)
                {
                case "pdf":
                    $ctype="application/pdf";
                    break;
                case "exe":
                    $ctype="application/octet-stream";
                    break;
                case "zip":
                    $ctype="application/zip";
                    break;
                case "doc":
                    $ctype="application/msword";
                    break;
                case "xls":
                    $ctype="application/vnd.ms-excel";
                    break;
                case "ppt":

                    $ctype="application/vnd.ms-powerpoint";
                    break;
                case "gif":
                    $ctype="image/gif";
                    break;
                case "png":
                    $ctype="image/png";
                    break;
                case "jpeg":
                case "jpg":
                    $ctype="image/jpg";
                    break;
                default:
                    $ctype="application/force-download";
                }
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: $ctype");
            header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\";");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: " . filesize($filename));
            readfile("$filename");
            exit();
            }
?>
Napísať odpoveď