[PHP] Verbergen van download link

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi, ik wil op mijn site een download sectie maken waarbij de bezoekers
de ware link van de download niet kunnen zien, dus als ik bijvoorbeeld doe
download.php?id=100 dat ie dan de goeie download pakt maar niet laat zien waar de file oorspronkelijk staat.
welke functie moet ik hier voor gebruiken en zijn er nog bijzonderheden waar ik rekening mee moet houden.
alvast bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

download.php

<?PHP
$id = $_GET['id'];
header("location: http://www.test.nl/download$id.zip");
?>

Zo iets maak er zelf wat leuks van.

[ Voor 27% gewijzigd door Verwijderd op 30-11-2003 16:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

fopen en fpassthru

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 30 november 2003 @ 16:04:
download.php

<?PHP
$id = $_GET['id'];
header("location: http://www.test.nl/download$id.zip");
?>

Zo iets maak er zelf wat leuks van.
Ik heb er zelf een voorkeur eigenlijk voor om dit soort dingen dan buiten de webroot te plaatsen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Zou opzich ook kunnen ja, heb ik alleen niet getest.
Ik zal hier eens naar kijken ;)

Acties:
  • 0 Henk 'm!

Verwijderd

gorgi_19 schreef op 30 november 2003 @ 16:05:
[...]

Ik heb er zelf een voorkeur eigenlijk voor om dit soort dingen dan buiten de webroot te plaatsen.
Ja, maar dat schiet niet zo op met die HTTP header. De client kan gewoon zien waar de file staat, en de file moet via HTTP bereikbaar zijn.
Daarom is die location header oplossing geen goede oplossing in dit geval.

[ Voor 1% gewijzigd door Verwijderd op 30-11-2003 16:08 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 30 november 2003 @ 16:08:
[...]

Ja, maar dat schiet niet zo op met die HTTP header. De client kan gewoon zien waar de file staat, en de file moet via HTTP bereikbaar zijn.
Daarom is die location header oplossing geen goede oplossing in dit geval.
Daar doelde ik ook eigenlijk op; ik ben weer eens onduidelijk geweest.. 't is volstrekt nutteloos als je deze methodiek gebruikt en daarna een redirect uitvoert.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wat is dan de beste funtie :+

Acties:
  • 0 Henk 'm!

  • Sir_Killalot
  • Registratie: Januari 2001
  • Laatst online: 15-09 12:56
Er zijn volgens mij zat programma's die alsnog de echte link kunnen achterhalen, niet 100% waterdicht dus :)

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Zie cheatah :)
Sir_Killalot schreef op 30 november 2003 @ 16:14:
Er zijn volgens mij zat programma's die alsnog de echte link kunnen achterhalen, niet 100% waterdicht dus :)
Ik ben benieuwd hoe ze dat willen doen als het buiten de webroot staat; dan heb je er nog niet zo veel aan. :)

[ Voor 52% gewijzigd door gorgi_19 op 30-11-2003 16:17 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik denk dat ik dan toch gewoon gebruik ga maken van de header() functie, dan zoek ik later nog wel uit hoe die fpassthru enzo werken.

bedankt igg :)

Acties:
  • 0 Henk 'm!

Verwijderd

Zie m'n eerste reply:

Eerst in de manual kijken en zoeken naar fpassthru en fopen, en je hebt dan in ieder geval minimaal een uur aan lees-en-probeer voer.

Acties:
  • 0 Henk 'm!

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Sir_Killalot schreef op 30 november 2003 @ 16:14:
Er zijn volgens mij zat programma's die alsnog de echte link kunnen achterhalen, niet 100% waterdicht dus :)
Als een bestand buiten de webroot staat, dan is er geen (directe) link naar het bestand. Wat natuurlijk wel zou kunnen is een programma wat een index maakt van de downloads.

download.php?ID=1 == bestanda.xxx
etc.

Om echt te voorkomen dat derde gebruik maken van je bestanden zul je een degelijke beveiliging op moeten zetten waarbij er aan elke oplossing die je aandraagt waarschijnlijk ook weer een nadeel kleeft voor de eindgebruiker... (al is het alleen maar in de zin van usability)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien een idee om de bestanden in een met .htaccess beveiligde directory te zetten, en deze dan ter download aan te bieden via een manier á la:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// url: www.test.nl/download.php?file=$file

$dir = "http://username:password@test.nl/bestanden/"; // directory
$path = $dir . $_GET['file'];

if(file_exists($path))
{
    $fp = fopen($path, "rb");

    header("Content-Type: application/force-download");
    header("Content-Length: " . filesize($path));

    fpassthru($fp);
    exit;
}


En als extra feature kun je de bestanden ook nog inpakken in een zip (of ander compressie formaat).

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op 30 november 2003 @ 17:51:
Misschien een idee om de bestanden in een met .htaccess beveiligde directory te zetten, en deze dan ter download aan te bieden via een manier á la:
phpcode
Kun je het beter buiten de html root zetten...

Acties:
  • 0 Henk 'm!

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

Spider.007

* Tetragrammaton

Samenvatting:

• gebruik de header functie om een 'eenvoudige' verberg functie te maken
• gebruik fpassthru voor goede beveiliging. Het maakt niet uit of je de bestanden binnen de webroot zet of niet; zolang je ze maar niet in de map 'bestanden' zet oid......

De oplossing van Obie is wel grappig; maar redelijk nutteloos imo. Je moet moeilijk doen om een htaccess beveiligde directory te maken en vervolgens ga je met een fopen (met de overhead van het http protocol) alsnog een (indirecte) call naar het filesysteem toe doen. Gebruik kan een fpassthru :)

Let bij de fpassthru oplossing er even op dat dit voor ernstig performance verlies kan leiden als je bijvoorbeeld veel kleine bestanden gaat aanbieden; er moet namelijk voor elke download een apache webserver proces opstarten....

[ Voor 3% gewijzigd door Spider.007 op 30-11-2003 18:59 ]

---
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!

Verwijderd

Nogmaals: met een location header kun je niet doen wat de topicstarter wil, en dat is dus géén oplossing.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Spider.007 schreef op 30 november 2003 @ 18:58:
Let bij de fpassthru oplossing er even op dat dit voor ernstig performance verlies kan leiden als je bijvoorbeeld veel kleine bestanden gaat aanbieden; er moet namelijk voor elke download een apache webserver proces opstarten....
Dat moet er ook als er geen php-script of whatever gebruikt wordt...

Waar je juist op moet wijzen is dat een file als '../../../../../../../etc/passwd' niet toegestaan mag worden (gewoon geen .., / en $ in de filenaam toestaan zou het grootste deel van de problemen, zo niet allen, moeten voorkomen).

Acties:
  • 0 Henk 'm!

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

Spider.007

* Tetragrammaton

Verwijderd schreef op 30 november 2003 @ 22:07:
Nogmaals: met een location header kun je niet doen wat de topicstarter wil, en dat is dus géén oplossing.
Ik ga bij de vraag van de TS in dit geval uit van een simpel scenario waarbij de TS niet wil dat zijn zusje de links kan knippen en plakken. Dit probleem is op te lossen met een location header; wat een simpele en snelle oplossing is :)

---
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!

Verwijderd

Is dan niet de beste en makkelijkste manier om van elk bestand een zip te maken? Want met dat script genereer je vanuit je PHP script een zip bestand met daarin alle bestanden die gedownload moeten worden.

Zo zie je uiteindelijk alleen maar de locatie van het zip bestand (bij het downloaden) en nooit (is volgens mij onmogelijk) de locatie van de bestanden die zich in díe zip bevinden.

Zo heb je het probleem gelijk opgelost, of je moet er problemen mee hebben dat het in een zip bestand moet worden gedownload...

Acties:
  • 0 Henk 'm!

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

Spider.007

* Tetragrammaton

Verwijderd schreef op 01 december 2003 @ 12:02:
Is dan niet de beste en makkelijkste manier om van elk bestand een zip te maken? Want met dat script genereer je vanuit je PHP script een zip bestand met daarin alle bestanden die gedownload moeten worden.

Zo zie je uiteindelijk alleen maar de locatie van het zip bestand (bij het downloaden) en nooit (is volgens mij onmogelijk) de locatie van de bestanden die zich in díe zip bevinden.

Zo heb je het probleem gelijk opgelost, of je moet er problemen mee hebben dat het in een zip bestand moet worden gedownload...
Wat is volgens jou dan het verschil tussen deze oplossing en het gebruiken van fpassthru :? Wat is er zoveel beter aan?

---
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!

  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Ik ben hier ook mee bezig geweest en het beste is dacht ik de bestanden buiten de www root te zetten, en de file te pushen dmv readfile():

code:
1
2
3
4
5
6
7
8
9
10
$file_download_name = $_GET["file"];
$downpath = "/usr/domain/<accountname>/
$download_size = filesize("$downpath$file_download_name");

header("Content-type: application/octet-stream\n");
header("Content-Disposition: attachment; filename=\"$file_download_name\"");
header("Content-Length: $download_size\n");
header("Accept-Ranges: bytes\n");

readfile("$downpath$file_download_name");


Bij mij zit er dan nog een stuk authorisatie voor.

[ Voor 11% gewijzigd door Sponz op 01-12-2003 14:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Spider.007 schreef op 01 december 2003 @ 12:41:
[...]


Wat is volgens jou dan het verschil tussen deze oplossing en het gebruiken van fpassthru :? Wat is er zoveel beter aan?
Is waarschijnlijk een stukkie sneller, vooral als je meerdere bestanden ineens wilt downloaden.
Pagina: 1