[php] download beveiliging

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
ik ben bezig met een download.php die eerst checked of je wel gerechtigd ben om het bestand te downloaden. deze roep je aan via download.php?id=123
Bovenin doe ik de check en als die geldig is doe ik het volgende:

PHP:
1
2
3
4
5
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Length: ' . filesize("./rapporten/$file")); 
header('Content-Disposition: attachment; filename=' . basename($file)); 
echo readfile("./rapporten/$file");


dit heb ik dus na een aantal zoektochten gevonden.

in firefox krijg ik het juiste bestand aangeboden en dat werkt verder prima. maar in internet explorer krijg ik eerst een open/save/cancel windows. doe ik save dan krijg ik een mooie error.
"internet explorer cannot download download.php?id=123 from blabla.nl
Internet explorer was not able to open this internet site. the requested site is either unavailable or cannot be found. please try again later."

doe ik open dan krijg ik een nieuwe window waarbij ik hem wel kan opslaan (open,save,cancell).

vreemd.... dit zou moeten werken volgens vele sites...

[ Voor 10% gewijzigd door sharkzor op 20-01-2006 11:24 ]


Acties:
  • 0 Henk 'm!

  • OverSoft
  • Registratie: December 2000
  • Laatst online: 31-07 20:46
Zo zou het ook moeten werken, zo doe ik het ook voor mijn PDFjes op mijn sites.
Al op een andere PC geprobeerd?
Weet je zeker dat je niet ergens een header met location hebt staan?

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 23:57
Misschien dat dit helpt?

code:
1
header("Content-Type: application/force-download");



in plaats van

code:
1
header('Content-Type: application/octet-stream');

Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
BarôZZa schreef op vrijdag 20 januari 2006 @ 11:34:
Misschien dat dit helpt?

code:
1
header("Content-Type: application/force-download");



in plaats van

code:
1
header('Content-Type: application/octet-stream');
nop. dan krijg ik gelijk de foutmelding.... vaag

Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

@MTWZZ:
code:
1
2
3
4
XML Parsing Error: mismatched tag. Expected: </meta>.
Location: http://www.barad-dur.nl/nx/tutorials/securedownload/
Line Number 48, Column 3:</head>
                         --^

met ff 1.5

Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
leuk. dit werkt met internet explorer (al krijgt de bestandsnaam automatisch download.pdf)
maar niet met firefox! die opent de zaak als platte tekst in de browser

dit heb ik eruit gevist:
PHP:
1
2
3
$fp = fopen("./rapporten/$file","r"); 
fpassthru($fp); 
bestandfclose($fp);


Als ik alle headers van mn andere post meestuur doet firefox het weer wel, maar ie6 het niet meer...
lijkt m dus in de headers te zitten.. kan het iets met iis te maken hebben?

[ Voor 19% gewijzigd door sharkzor op 20-01-2006 15:42 ]


Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
ik post even een reply. als ik het stukje code in een los bestand mik, dan doet hij het wel!

het komt dus blijkbaar door de code erboven... maar ik zou niet weten waardoor het komt.
let nog even niet op de rommel, nog niet alles werkt perfect (login enzo) dus het is ffe een test bestandje.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
    session_start();
    require('configuratie.php');
    $logindir = "login/"; //dit is om aan te geven waar het loginscript staat
    require($logindir."connect.inc.php");
    require($logindir."login_functions.inc.php");
    $rDbConn = connect_to_database();
    $acces = "denied";
    $rapid = $_GET["id"];
    
//  if(!check_login($rDbConn))
//  {   echo 'u bent niet ingelogd'; }

if($acces != "denied") //om ffe te testen
{
}
    else
    {
        //klant id opvrage
        if(isset($_SESSION['klantid']))
        {   $kid = $_SESSION['klantid'];    }
        else
        {   $kid = $_COOKIE['klantid'];     }
        $kid =44;
        
        //in gekochte rapporten zoeken
        $SQLquery = "SELECT id FROM bestellingen WHERE betaald = 'ja' AND klantid = $kid AND id IN(SELECT caseid FROM caseregels WHERE rapid = $rapid)";
        $result=mysql_query($SQLquery);
        if(mysql_num_rows($result) > 0)
        {
            $acces = "granted";
        }
        else
        {
            //checken abo       
            $sql3 = "SELECT cas.aboid FROM caseregels cas, abonnement abo WHERE cas.aboid=abo.id AND caseid IN(SELECT id FROM bestellingen where klantid = $kid AND betaald = 'ja')";
            $result3=mysql_query($sql3);
            while($row3 = mysql_fetch_array($result3, MYSQL_NUM))
            {
                $sql4="SELECT rap.id FROM aborap ar, rapport rap WHERE rap.id = $rapid AND ar.aboid = $row3[0]";
                $result4=mysql_query($sql4);
                if(mysql_num_rows($result4)>0)
                { $acces = "granted"; }     
            }

        }
    }
    if($acces == "granted")
    {
        //rapport opvragen
        $SQLquery5 = "SELECT locatie FROM rapport WHERE id = $rapid";
        $result5=mysql_query($SQLquery5);
        $row5 = mysql_fetch_array($result5, MYSQL_NUM);
        $file = $row5[0];

    // verstuur de headers om het bestand te downloaden 
        
        header('Content-Description: File Transfer'); 
        header('Content-Type: application/force-download'); 
        header('Content-Length: ' . filesize("./rapporten/$file")); 
        header('Content-Disposition: attachment; filename=' . basename($file)); 
        $fp = fopen("./rapporten/$file","r"); 
        fpassthru($fp); 
        bestandfclose($fp);
 
    }
        
        
?>


de bestanden die require opvraagt bevatten alleen maar pure php code. geen echo's of andere meuk die headers verstuurd...
wie weet het antwoord?

[ Voor 11% gewijzigd door sharkzor op 20-01-2006 15:50 ]


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

TheRookie schreef op vrijdag 20 januari 2006 @ 14:13:
@MTWZZ:
code:
1
2
3
4
XML Parsing Error: mismatched tag. Expected: </meta>.
Location: http://www.barad-dur.nl/nx/tutorials/securedownload/
Line Number 48, Column 3:</head>
                         --^

met ff 1.5
Vreemd hier met 1.0.7 geen problemen. De W3 Validator vindt het ook prima. Ik zal er iig even naar kijken.

Nog even een link naar een werkende versie van dit ding. (Het kan zijn dat m'n tutorial een tikje afwijkt :P)
http://www.barad-dur.nl/pub/securedl.php

[ Voor 18% gewijzigd door MTWZZ op 20-01-2006 17:48 ]

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 29-07 16:13
Je gebruikt mysql_fetch_array, en je vraagt de data op met:
PHP:
1
$row5[0]

Volgens mij is het toch:
PHP:
1
$row['veldnaam']

En je moet quotes buiten vars plaatsten:
PHP:
1
$var = 'Geblaat'.$bla.'Meer geblaat';

Acties:
  • 0 Henk 'm!

Verwijderd

Depress schreef op vrijdag 20 januari 2006 @ 19:30:
Je gebruikt mysql_fetch_array, en je vraagt de data op met:
PHP:
1
$row5[0]

Volgens mij is het toch:
PHP:
1
$row['veldnaam']

En je moet quotes buiten vars plaatsten:
PHP:
1
$var = 'Geblaat'.$bla.'Meer geblaat';
Niets van bovenstaande is waar, althans niet in de zin dat daar fouten door ontstaan.

De array mag je idd met de veldnaam aanspreken, maar het indexnummer werkt ook. Voor de werking mogen vars binnen de quotes staan.

Je opmerkingen zijn niet onterecht, je hebt gelijk dat jouw methodes netter zijn, maar het is dus niet noodzakelijk.

[ Voor 4% gewijzigd door Verwijderd op 20-01-2006 23:29 ]


Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
ik geloof dat ik zegegd had dat dit een testscript was... wat betekend dat niks nog netjes is. wat me trouwens even niet boeid, het moet eerst werken.

Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 14-07 08:41

Spockz

Live and Let Live

Dit is wat ik gebruik, het werkt in Firefox 1.5 en IE 6 andere heb ik niet geprobeerd.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
session_start('id');
    
if(isset($id) && is_numeric($id))
{
    require ('database.php');

    connecttodatabase();
    $query   = "SELECT name, type, size, content FROM hw_downloads WHERE id = '$id'";
    $result  = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);
    $name = str_replace(' ', '_', $name);
    
    header("Content-Disposition: attachment; filename=$name");
    header("Content-length: $size");
    header("Content-type: $type");
    echo $content;

    exit;
}


En dan kijk ik gewoon met behulp van sessies of dat bestand wel gedownload mag worden met die 'rang'.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
ja, lijkt wat op die van mij.
Dit heb ik nu als test ernaast

PHP:
1
2
3
4
5
6
7
8
$file="ci0001.pdf";
header('Content-Description: File Transfer'); 
header('Content-Type: application/force-download'); 
header('Content-Length: ' . filesize("./rapporten/$file")); 
header('Content-Disposition: attachment; filename=' . basename($file)); 
$fp = fopen("./rapporten/$file","r"); 
fpassthru($fp); 
bestandfclose($fp);


het vreemde is dat het ZO wel werkt. dit is exact dezelfde code als in mn bestand wat je hierboven ziet.... ik snap er echt NIKS meer van....

[update]
als ik session_start() wegslash dan doet hij het wel!!!! WTF????? iemand een verklaring?

[ Voor 17% gewijzigd door sharkzor op 20-01-2006 22:44 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Weet je heel zeker dat er in je originele script geen enter of andere whitespace ergens voor je script zit? Daar willen browsers nog weleens over vallen.
als ik session_start() wegslash dan doet hij het wel!!!! WTF????? iemand een verklaring?
session_start verstuurd een cookie die IE wellicht niet kan waarderen?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 28-07 16:23
Spider.007 schreef op vrijdag 20 januari 2006 @ 22:59:
Weet je heel zeker dat er in je originele script geen enter of andere whitespace ergens voor je script zit? Daar willen browsers nog weleens over vallen.


[...]
session_start verstuurd een cookie die IE wellicht niet kan waarderen?
nop. alles is puurt...

en over die sessies, Spockz gebruikt dat ook en bij hem werkt het wel... vreemd dat het na het weghalen het bij mij pas ook weer doet...

heeft iemand nog een idee? anders ben ik genoodzaakt een id check te doen zonder sessies. beetje lastig omdat mn cookies nog niet echt willen meewerken van het login script :D
Pagina: 1