29. marts 2007 - 17:33Der er
20 kommentarer og 2 løsninger
Sikre mappeinnhold
Hei.
Jeg har lavet en webside hvor det er mulig å laste ned dokumenter fra forskjellige mapper. Jeg har da en hovedmappe som også består av flere undermapper, hvor det da er gemt forskjellige dokumenter. Og mitt ønske er å kunne sikre mappeinnholdet mot forsøk på å hente det via den direkte stien/url'en. Jeg har kikket litt på .htaccess, men har ikke funnet en tilfredstillende løsning. Mye pga at det er en side hvor brukere kan registrere seg, og jeg må da evt oppdatere en .htpasswd fil hele tiden. Og jeg lurer da på om det er noen som har et bud på et godt alternativ, eller en god .htaccess løsning? Ønsket er at det lige ligger en sjekk-filen i rod-mappen til mappesystemet.
Du kan vist lave en htaccess som blokerer mappen helt: Order allow,deny Allow by none Deny from all
Så kan du bruge php til at tvinge browseren til at downloade stien. Du skal bare gøre så den kun gennemtvinger download hvis personen der er logget ind har ret til det. Jeg tror det vil virke sådan. Her er php: <?php $filnavn = "fil_at.hente";
Jeg har tatt utgangspunkt i coderdk sitt eksempel ettersom jeg tror jeg må benytte meg av "url request". Men jeg har en side fra før som lister alle mappene samt de underliggende dokumentene i de forskjellige mappene. Og jeg har derfor lavet en funksjon av ditt eksempel coderdke, og denne funksjonen ligger i en ekstern fil. Jeg har ikke lavet store forandringene enda, men har lige noen spørsmål...
return $file; if (!empty($file)) { $filepath = realpath($root . $sep . $file); } if ( $root != substr($filepath, 0, strlen( $root))) { die( "Ikke tilladt." ); } else { header( "Cache-control: private" ); header( "Expires: Mon, 26 Jul 1997 00:00:42 GMT" ); header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate" ); header( "Cache-Control: post-check=0, pre-check=0", false ); header( "Pragma: no-cache" ); header( "Content-Type: application/octet-stream" ); header( "Content-Transfer-Method: Binary" ); header( "Content-Length: " . filesize( $filepath ) ); header( "Content-Disposition: attachment; filename='" . basename( $filepath ) . "'" ); readfile( $filepath ); } } } parameteren sender inn hentes fra linken til dokumentet som blir trykket på, og hentes via $_GET['file']. Og kan f.ex se sådan ud mappe/mappe/test.doc. Og jeg har prøvet meg litt frem ved å returnere det forskjellige variablene for å se hva verdi de får og sånn som $filepath = realpath($root . $sep . $file); ser ikke ud til å gi $filepath noen verdi? Og er det evt. noen andre forandringer jeg børr gjøre med tanke på min metode?
btw genereres funksjonen fra siden som lister mapper og dokumenter på den her måde: if(isset($_GET['file'])){ download($_GET['file']); }
Arg, jeg fant feilen. Jeg hadde skrevet dokomenter istedet for dokumenter. Så nå "finner" den dokumentet, men jeg har ikke muligheten får å lige åpne dokumentet for å kigge på det, jeg må gemme det først. Jeg hadde ønske å kunne lige velge åpne.
Vet ikke om det skal have noget å si, men stien som $root = realpath( "." ) . $sep . "dokomenter"; genererer er sånn: /var/www/minside.dk/dokumenter/test.doc
Jeg vil bare legge til at jeg har fått amews_aj sin versjon til å virke i både explorer og opera når den ser sådan ud: function download($file){ $filnavn = $file;
$file_path = $_SERVER['DOCUMENT_ROOT'] . "/dokumenter/" . $filnavn; if (file_exists($file_path) && $filnavn != "" ) { header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/octet-stream"); header("Content-Length: " . filesize($file_path)); header("Content-Disposition: attachment; filename=".basename( $filnavn ).""); readfile($file_path); }else{ echo "Filen findes ikke!"; } } Din versjon coderdk, har jeg fått til å virke i opera browseren men ikke i explorer, den forsøker å åpne dokumentet i word, men får beskjed om at den ikke finner filen. Den ser for øyeblikket sådan ud: function download($file){
Jeg fjernet altså bare to ' i filename=" . basename( $filepath ) . "".
Så jeg vet ikke om du kan gjennomskue hva som gjør at din versjon ikke virker i explorer sammenlignet med amews_aj sin? Jeg vet for lite om "header informasjonen"
Da har jeg forsøkt å byttet ud header()-kaldet med den overnevte, men får samme feilmelding fra word når jeg forsøker å åpne via exploerer. Men det kan de ut som det er denne linjen som laver balader:
Har du noen formening om linjen header( "Cache-Control: no-store, no-cache, must-revalidate" ); bør være med coderdk? Post et svar iallfall, sånn at du kan få dine points for hjelpen.
Jeg tror nu godt at den virker uden linjen - Jeg mener også at der er en af de linjer der kan skabe problemer i nogle browsere... Anyway, tag nogle point selv også :D
Ok, takk for svar og hjelp med å løse oppgaven. Om jeg får et svar fra amews_aj også, så skal han få noen av pointsene, ettersom han også kom med en løsning som virket etter mine behov. Så da venter jeg litt for å se om han kommer med et svar, ellers får du alle pointsene.
Jeg har i grunn utviklet min "egen" løsning ved bruk av deres forslag. Men ettersom coderdk har vært behjelpelig og brukt litt mer tid på å få enkelte deler av hans forslag til å virke etter mine behov, ønsker jeg å gi han litt mer points. Håper poengfordelingen er ok for dere. Og igjen takk for hjelp.
Lort, jaja, nå var det meningen at coderdk skulle få 40 points og arnews_aj 20, men jeg trykket forkert :/ Håper det går fint at dere fikk 30 points hver.
Heller ikke noget problem her ;) Jeg er ikke en af dem der går vildt meget op i point :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.