fa74b4a4-8b2c Skrevet 29. mai 2008 Del Skrevet 29. mai 2008 Jeg har en hjemmeside som der jeg bruker session() for å logge på. Jeg har en mappe med mange forskjellige filer (.doc, .pdf. jpg. osv) som jeg ønsker at en kun skal få tilgang til når en er pålogget. La oss si at alle filene ligger i mappen "privat". Når man åpner webadressen minside.no/privat, lister apache opp alle filene i mappen. Dette løste jeg ved å lage "index.php"i "privat" mappen, og legge inn følgende kode: <?php session_start(); if(!session_is_registered(myusername)){ header("Location: ../index.php"); } ?> Dette fører til at man kun får åpnet mappen når man er innlogget. Hvis man feks skriver minside.no/privat/fil.txt, får man lese denne filen uten at man er innlogget. Er det noen måte å fikse dette på? Dette var kanskje litt krunglete forklart, men jeg har ikke mye erfaring innen php Tusen takk for hjelpen... Lenke til kommentar
ThaKladd Skrevet 29. mai 2008 Del Skrevet 29. mai 2008 Du kan inkludere txt fila i en php fil, som sjekker om du er logget på. Txt fila kan du så putte et sted man ikke får tilgang til den, for eksempel under "../privat/fil.txt" -> altså hakket under public_html/ Lenke til kommentar
fa74b4a4-8b2c Skrevet 29. mai 2008 Forfatter Del Skrevet 29. mai 2008 (endret) Tusen takk for raskt svar, jeg er helt ny innen php, har du et eksempel på hvordan dette kan gjøres Vil dette også virke med andre filtyper? Tusen takk for all hjelp (jeg har laget et upload script som laster opp alt til mappen "privat". Jeg ønsker at man også da må logge på for å kunne laste ned/lese filene i mappen.) Endret 29. mai 2008 av J0nny Lenke til kommentar
ThaKladd Skrevet 29. mai 2008 Del Skrevet 29. mai 2008 (endret) Har ikke gjort det selv så tar sikkert litt for mye tid for meg å prøve å lage et fungerende eksempel nå, har en del eksamener på vei. men når du laster opp en fil, så lagre det på ../private/fil.txt - i forhold til public_html/ mappa når du så er på den filen der du skal se teksten i fil.txt, la oss si den ligger som public_html/visfiltxt.php så har du koden: <?php if ($_SESSION['LoggedIn']) { //gitt att du setter denne til true når du logger inn... include ("../private/fil.txt"); } else { echo 'Du må være logget inn for å innholdet i fil.txt'; ?> Det du ønsker er altså å få listet opp alle filene i private mappen istedenfor å få se teksten i bare fil.txt - og det finner du sikkert kode til ettellerannet sted - å liste opp innholdet i en mappe, som du da legger inn rett sted i if setningen. Endret 29. mai 2008 av ThaKladd Lenke til kommentar
fa74b4a4-8b2c Skrevet 29. mai 2008 Forfatter Del Skrevet 29. mai 2008 I public_html mappen, har jeg opprettet en mappe som heter privat. I denne mappen havner alle filene som blir lastet opp med et upload script. I mappen privat har jeg laget en index.php fil med følgende kode: Klikk for å se/fjerne innholdet nedenfor <?php session_start(); if(!session_is_registered(myusername)){ header("Location: ../index.php"); } ?> <?php $count = 0; if ($handle = opendir('.')) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") {$count++; print("<a href=\"".$file."\">".$file."</a><br />\n"); } } echo '<br /><br /><a href="..?id=3">Return</a>'; closedir($handle); } ?> Dette scriptet lister kun opp alle filene i mappen privat hvis brukeren er innlogget. Hvis ikke blir bruker sendt til innloggingssiden. Hvis bruker går til minhjemmeside.no/privat uten å være innlogget, vil ikke filene bli vist. Hvis en bruker feks skriver minhjemmeside.no/privat/fil.txt (eller fil adressen til noen av de andre filene i mappa) så vil innholdet av den aktuelle filen bli vist uten at bruker er inlogget. Lurer på om det er mulig å sette en session() eller lignende på enkelt filer? Nå er det mulig få frem enkelt filer hvis du vet hva filen heter.... Tusen takk for hjelpen så langt ThaKladd Lenke til kommentar
ThaKladd Skrevet 29. mai 2008 Del Skrevet 29. mai 2008 (endret) En liten detalj du har misset på. Når du har "../" i forhold til public_html/ så betyr det at du må lage privat mappen, ikke i public_html/, men som en nabo til den, hvis du forstår. Du må hoppe ett hakk tilbake, lage mappen privat i samme mappe som public_html er og så linke filene til den ved bruk av "../". hvis du har en index.php i en egen privat mappe(public_html/privat/index.php) så for å komme til den nye mappen så er banen i denne index.php fila slik:"../../privat/fil.txt" Man kan nemlig ikke på en webside skrive adressen til en mappe som ligger utenfor public_html, bare de som er i den. Men PHP kan henter, lese og skrive til filene som ligger der. Da trenger du heller ikke tenke session på hver enkelt fil(noe som ikke er mulig). edit: Rask eksempel på struktur: +etc +logs +mail +public_ftp +public_html +privat index.php index.php +privat fil.txt Er bare usikker på hvorvidt du får lest filene hvis de er linket tilbake slik da. For du skal jo kunne laste de ned og slik. Endret 29. mai 2008 av ThaKladd Lenke til kommentar
fa74b4a4-8b2c Skrevet 30. mai 2008 Forfatter Del Skrevet 30. mai 2008 Må igjen takke for mye god hjelp... Har nå prøvd ut det du sa i forrige post, å legge bildene utenfor public_html mappen. Dette virket forsåvidt ganske bra. Du hadde rett med at det ble problemer med å linke til filene for å kunne laste dem ned... Jeg tror muligens den beste måten å løse mitt problem vil være å feks legge filene i en mappe med et langt vanskelig navn, og deretter hente dem frem med følgende adresse: index.php?id=fil.txt og deretter lage en session i index fila. Er du enig med meg i dette? Vil filadressen til filen bli synlig på denne måten? Det siste jeg lurer på er, hvordan jeg lager en slik adresse til til hver fil når mappen består av mange forskjellige filtyper. Jeg fikk til å lage et script hvor adressen feks ble index.php?id=5 (for å hente frem .php filer.) Koden for dette scriptet er her: Klikk for å se/fjerne innholdet nedenfor <?php $id = $_GET['id']; if(!isset($id) || strpos($id, "../")!==FALSE) { $id = "1"; } $incfil = "./id" . $id . ".php"; if(file_exists($incfil)) { include($incfil); } else { print("Siden finnes ikke!"); } ?> Lenke til kommentar
ThaKladd Skrevet 30. mai 2008 Del Skrevet 30. mai 2008 (endret) Er du enig med meg i dette? Til en viss grad. Hvis det er sensitiv informasjon i tekstfiler og slikt, så kan likevel søkemotorer greie å fange det opp. Det greier de ikke hvis filene er lagret utenfor public_html. Eventuelt så kan du sikre deg mot roboter på de valgte mappene ved å legge inn en robots.txt fil i public_html som innholder: User-agent: * Disallow: /privat/ Man vil likevel kunne lese filen dersom de har direkte link, noe som var problemet ditt. Vil man hacke så kan man finne denne privatemappa ved å se i robots.txt fila, sant. Men fjerner du mulighet for visning i mappa(med indexfila di, eller chmod), samtidig som du hindrer søkemotorene og begrenser tilgangen til filene - og at de kun hentes ved at man må være logget inn - så har du kommet et stykke. Det er ikke lurt å ha id=filnavn.txt hvis denne linken er public og alle kan se den, siden man kan finne hvor den sannsynligvis er. Hvis du gjør det public så kan du lage en kronglete mappe under privat mappa igjen - som bare php koden og du vet om. Da blir det vanskelig å tippe. Ellers så er ikke det så ille, dersom du etter slik jeg har fortstått, kun ser linken ved å være logget inn - og fila blir henta kun om du er det(da vil ikke en tipp på id=filnavn.txt kunne vise filnavn.txt - fordi koden for å sjekke id ligger bakendor en sjekk om du er innlogget). Men du blir ikk kvitt problemet med at man likevel kan like direkte til fila hvis man vet navnet på mappen og navnet på fila. Forstod ikke helt hva du ville med det siste du lurte på... kanskje jeg bare et trøtt. Føler jeg har forklart alt litt kronglete... hehe. edit: småtteri og rettelser. Endret 30. mai 2008 av ThaKladd Lenke til kommentar
fa74b4a4-8b2c Skrevet 30. mai 2008 Forfatter Del Skrevet 30. mai 2008 (endret) Føler jeg har forklart alt litt kronglete... Synes jeg har fått mange gode og utfyllende svar av deg - tusen takk for det. Er klar ovrer at man kan linke direkte til en fil, selv om man bruker id=, men hvis filene ligger i en mappe som feks heter "451555442", så antar jeg at dette vil være så godt som løst. Det siste jeg lurte på, var hvordan jeg skal få adressen til å bli index.php?id=fil.txt (.doc. jpg eller hvilken fil som måtte befinne seg i mappa). Det scriptet som ligger i forrige post, henter frem .php filer, hvordan blir dette når filene ikke er de samme (forskjellige typer)? Hvilke forandringer må jeg gjøre i scriptet for at bruker skal få frem en "download-link" til den aktuelle filen når adressen index.php?id=filnavn skrives? Håper dette var bedre forklart... Endret 30. mai 2008 av J0nny Lenke til kommentar
ThaKladd Skrevet 30. mai 2008 Del Skrevet 30. mai 2008 (endret) Okey.. tror det demrer. Løsningen er så enkel som at du fjerner: . ".php" Id'n din innholder jo filetternavnsinformasjon. I scriptet ditt gjør den ikke det, der blir den lagt til når filen skal hentes. Det er løsningen... tror jeg... Endret 30. mai 2008 av ThaKladd Lenke til kommentar
Ernie Skrevet 31. mai 2008 Del Skrevet 31. mai 2008 Hva med å bare sperre tilgangen via en .htaccess-fil? deny from all Burde vel gjøre jobben. Forutsetter såklart apache, men det kjører vel de fleste webhostene? Lenke til kommentar
fa74b4a4-8b2c Skrevet 31. mai 2008 Forfatter Del Skrevet 31. mai 2008 Hva med å bare sperre tilgangen via en .htaccess-fil? deny from all Dette hindrer vel de som også er pålogget ifra å lese filene? Løsningen er så enkel som at du fjerner: . ".php" Dette virket nesten. Eneste var at jeg må kalle filen "idfil.txt" istedenfor "fil.txt" Er det mulig å endre på dette?Hvis jeg feks åpner et word dokument (.doc), blir dokumentet åpnet i nettleseren, og det kommer en masse rare tegn og symboler. Er det mulig å få til en "download-link", slik at man får opp spørsmål om man vil lagre filen? Lenke til kommentar
Ernie Skrevet 31. mai 2008 Del Skrevet 31. mai 2008 Hva med å bare sperre tilgangen via en .htaccess-fil? deny from all Dette hindrer vel de som også er pålogget ifra å lese filene? Ikke hvis du inkluderer filene i et beskyttet script. Lenke til kommentar
ThaKladd Skrevet 31. mai 2008 Del Skrevet 31. mai 2008 (endret) Du må selvsgt også fjerne "id" i "./id". Så ikke at den var der. lurer på om det fungerer ved å sette header slik: header('Content-disposition: attachment;') da tvinges hver link til å lastes ned som attachment. Men er ikke sikkert hvordan det da virker på vanlige linker... test. Tror du egentlig også må definere filtypen i header... Endret 31. mai 2008 av ThaKladd Lenke til kommentar
fa74b4a4-8b2c Skrevet 31. mai 2008 Forfatter Del Skrevet 31. mai 2008 Du må selvsgt også fjerne "id" i "./id".Takk skal du ha, tenkte ikke på det. Nå fikk jeg alt til å virke slik jeg ønsket. Løsningen ble slik: $id = $_GET['id']; if(!isset($id) || strpos($id, "../")!==FALSE) { $id = "1"; } $incfil = "./" . $id; if(file_exists($incfil)) { header("Location: $incfil"); } else { print("Filen finnes ikke"); } Tusen, tusen takk for mye god hjelp Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå