Archief - PHP: Download restrictie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

[bug]

Legacy Member
Voor onze klas heb ik enkele php pagina's gemaakt die enkel toegankelijk zijn na het inloggen. Op een bepaalde pagina wordt de inhoud van enkele mappen getoond (schoolbestanden). Maar als je surft naar de directe link van ,bijvoorbeeld een Word document, kan je deze file nog steeds downloaden.

Nu vraag ik me af hoe je kan voorkomen dat ofwel:

- je naar de directe link kan surfen,
- of dat je bestanden kan downloaden zonder ingelogd te zijn.

Bedankt.

dJeez

Legacy Member
Door de bestanden zelf ofwel buiten de webroot van je webserver te zetten ofwel in een folder waar je enkel via Basic User Authentication (op Apache instelbaar via vb. htaccess bestandje) op kan. Uiteraard moet je er dan wel voor zorgen dat je een script schrijft om de betreffende bestanden effectief te downloaden, maar da's wel poepsimpel (in PHP volstaat een simpele fpassthru) - maarreuh, bouw dan wel voldoende tests in dat scriptje in zodat ze niet elk willekeurig PHP script van je site kunnen downloaden via dat script :p.

[bug]

Legacy Member
De optie om de bestanden in een map te zetten met Basic User Authentication valt al weg aangezien de gebruikersnamen en wachtwoorden uit een mysql database worden gehaald.

Maar wat bedoel je met de bestanden buiten de webroot te zetten? Hoe link ik dan naar een file buiten de webroot ?

dJeez

Legacy Member
[bug];9609433 zei:
De optie om de bestanden in een map te zetten met Basic User Authentication valt al weg aangezien de gebruikersnamen en wachtwoorden uit een mysql database worden gehaald.
Hoe je de gebruikers die toegang willen tot je backend scripts gaat authentificeren heeft er dus niks mee te maken hé. Je moet gewoon instellen dat de folder waar je de bestanden in plaatst enkel mits een geldige logon/paswoord combinatie geconsulteerd kan worden...

In principe kan je aan elk bestand dat op het filesysteem staat (voorzover de gebruiker waaronder PHP draait er rechten toe heeft uiteraard), dus zoals ik zei gebruik je dan een script dat gewoon rechtstreeks het correcte bestand gaat uitlezen. Makkelijkste lijkt mij dan om in een DB bij te houden welke bestanden je hebt, met een unieke ID als key. Op basis van die ID (die je dan in de link naar het downloadscript gebruikt als parameter) ga je het absolute pad op de server genereren en dump je daarna gewoon de inhoud van het correcte bestand via vb. fpassthru.

Het spreekt voor zich dat het download script zelf ook eerst test of er wel een gebruiker is ingelogd...

[bug]

Legacy Member
Ah zo ja, dan ga ik eerst mijn script moeten aanpassen zodat alle uploads van bestanden gelogd worden, want dat is nu nog het geval niet. Da's voor na de examens ;)

Alvast bedankt!

[bug]

Legacy Member
Kan je me een voorbeeld php-code verschaffen die het lokale pad op de server omzet naar een link om het bestand te downloaden?

Stel het bestand staat in c:\domains\domain.com\files\test.txt

Of zie ik het verkeerd?

killgore

Legacy Member
je ziet het verkeerd, je gaat het niet omzetten, je gaat een nieuw php bestand maken, zoals download.php waarin je zoiets zet:

PHP:
//mysql_connect enzo
if(!isset($_GET["fileid"]) || !is_numeric($_GET["fileid"])) exit;
$id = $_GET["fileid"];

$sql = "SELECT filename FROM files WHERE fileid=$id";
$result = mysql_query($sql);
if($file=mysql_fetch_row($result))
{
    $fp = fopen($file["filename"],"rb");
    if(!$fp) exit;
    fpassthru($fp);
}

Uitgebreider ga je juiste headers zetten zodat ze de lengte van het bestand kennen, parallele downloads ondersteunen, gebruikersvoorwaarden controleren, ... . Maar basic komt het hier op neer :).

download.php?fileid=1 gaat dan het bestand downloaden dat overeenkomt met id 1 in je database.

dJeez

Legacy Member
Het bovenstaande is inderdaad ongeveer wat ik poogde uit te leggen in mijn posts :p.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan