Lösenordsskydda enskilda filer i PHP

Tråden skapades och har fått 26 svar. Det senaste inlägget skrevs .
1
  • Oregistrerad
  • 2004-09-29 13:05

Jag har byggt en site mha PHP som kör på Apache. Nu är det så att jag vill att vissa filer, t ex pdf-dokument etc, inte ska vara för allmänheten utan kräva inloggning. Själva inloggningen i sig är inget problem, men jag undrar om det är någon som har en smidigare lösning än den jag har gjort:

Jag har lagt de skyddade filerna på icke-webarean, dvs i detta fall i en mapp bredvid wwwroot. Då kommer man inte åt dem mha att gissa en URL. Sedan har jag en sida som i PHP läser upp den filen och returnerar (om man är inloggad givetvis).

Detta blir lite rörigt om man har en sida med en blandning av skyddade och oskyddade filer. Ska man kanske lägga alla filer i en MySQL-databas och sätta ett attribut på dem att de kräver inloggning?

Är det ngn som har erfarenhet av detta och har en supersmidig lösning?

Oj... hmmmm ja jo... jag byggde en liknande lösning. Tankade upp allt i MySQL databasen, satt en behörighets flagga på dem så att rätt personer med rätt behörig fick ladda ner vissa filer.
Så du är inne på rätt spår.
MySQL databasen kan bli tungdriven med en massa filer i sig.
Men av någon anledning kalldes vår MySQL server för monster...

  • Medlem
  • Stockholm
  • 2004-09-30 11:14

Strunta i att spara FILEN i databasen... spara bara information om filen. Som Mattias skriver så kan databasen bli väldigt stor och 'tungdriven' annars

  • Oregistrerad
  • 2004-09-30 11:20

Jo kanske det... Men å andra sidan, webbhotellet har 50 mb webbutrymme och 3x25 mb MySQL-databasutrymme, så jag tänkte utnyttja databaserna!

Ska man kunna administrera en MySQL-databas på ett webbhotell från en annan dator? Eller måste man installera ett php-verktyg på webbhotellet (typ phpAdmin)?

Ursprungligen av torbjorn2000:

Ska man kunna administrera en MySQL-databas på ett webbhotell från en annan dator? Eller måste man installera ett php-verktyg på webbhotellet (typ phpAdmin)?

Jag använder CocoaMySQL på macen och redigerar ett antal databaser med den, funkar bra.
Borde finnas på versiontracker.com eller macupdate.com

Man brukar aldrig rekommendera att spara filer i databaser; tillvägagånssättet du använt dig av är helt korrekt och det bästa tänkbara. Köp lite mer utrymme; kostar ju nästan gratis.

  • Medlem
  • Stockholm
  • 2004-09-30 18:08

CocoaMySQL fungerar rätt bra.

Om du kan använda det eller ej beror på ditt webhotell. För att öka säkerheten så kan man(=webhotellet i det här fallet) konfigurera så att anslutningar till databasen endast får göras lokalt.

Å andra sidan är phpMyAdmin rätt bra, har klarat mig långt med det.

  • Medlem
  • Stockholm
  • 2004-10-01 11:55

Håller med.

Fördelen med CocoaMySQL är att det känns rappare (enligt mig)

  • Oregistrerad
  • 2004-10-04 13:04

Efter mycket bråk med webbhotellet (Ballou) så har det kommit fram att man inte KAN lägga filer på annat ställer än i wwwroot, dvs den publika webkatalogen. PHP har inte permissions att läsa filer utanför wwwroot...

Däremot kan man använda sig av .htaccess-metoden. Men då fruktar jag att man får upp en login-ruta för varje nytt dokument som ligger i en skyddad mapp, eller räcker det med att logga in en gång? Ngn som vet?

  • Medlem
  • Gävle
  • 2004-10-04 13:52
Ursprungligen av torbjorn2000:

Däremot kan man använda sig av .htaccess-metoden. Men då fruktar jag att man får upp en login-ruta för varje nytt dokument som ligger i en skyddad mapp, eller räcker det med att logga in en gång? Ngn som vet?

Om du lösenordsskyddar mappen så räcker det med att de loggar in en gång (per besök).

  • Medlem
  • Göteborg
  • 2004-10-04 17:41

Jo det är rätt, det räcker att logga in en gång för att komma åt alla filer med htaccess. Har ett kanonscript i PHP/mySQL för att administrera konton för olika rättigheter till filer. Problemet är ju bara som sagt att man endast kan skydda websidor på detta sätt. Jag vill skydda ALLA filer, videofiler etc så att man inte kan komma åt en fil genom att knappa in/gissa sig till en URL för filen. Då kan man tycka att htaccess skulle vara lösningen och det är det ju till viss del.

Finns ett problem dock. Jag vill använda ett vanligt snyggt JavaScript-formulär för användaren att ange användarnamn och lösenord, så man slipper det ap-fula grå formuläret som annars dyker upp. Detta skript skickar sedan info till den htaccess-skyddade mappen i formen användarnamn:lösenord@mindomän/skyddad_mapp. Detta funkar kanon för alla webläsare och operativsystem jag testat det på UTOM senaste Microsoft Internet Explorer för Windows. Anledningen är att MS har stängt denna möjlighet för de tycker det är en säkerhetsrisk...

Hittade ett php-script som sade sig fixa detta även med senaste IE-uppdateringen men det funkade inte det heller tyvärr. Är det någon som fixat lösning på detta så skulle det vara suveränt om ni kan visa hur.

I nuläget blir det så att de som har denna version av IE först får logga in med JavaScript-formuläret och sedan måste logga in en gång till i det grå htaccess-formuläret. Grymt irriterande och typiskt Microsoft att komma med sin egen lösning vilken i detta fallet försvårar för utvecklaren.

I och med att majoriteten av webanvändarna kör IE på Windows och att de dessutom uppdaterar i löpande takt måste man ju ha en lösning som funkar även för dessa. (Tidigare versioner av IE för Windows funkar fortfarande lika bra som andra browers)

  • Medlem
  • Göteborg
  • 2004-10-04 17:42

Jo det är rätt, det räcker att logga in en gång för att komma åt alla filer med htaccess. Har ett kanonscript i PHP/mySQL för att administrera konton för olika rättigheter till filer. Problemet är ju bara som sagt att man endast kan skydda websidor på detta sätt. Jag vill skydda ALLA filer, videofiler etc så att man inte kan komma åt en fil genom att knappa in/gissa sig till en URL för filen. Då kan man tycka att htaccess skulle vara lösningen och det är det ju till viss del.

Finns ett problem dock. Jag vill använda ett vanligt snyggt JavaScript-formulär för användaren att ange användarnamn och lösenord, så man slipper det ap-fula grå formuläret som annars dyker upp. Detta skript skickar sedan info till den htaccess-skyddade mappen i formen användarnamn:lösenord@mindomän/skyddad_mapp. Detta funkar kanon för alla webläsare och operativsystem jag testat det på UTOM senaste Microsoft Internet Explorer för Windows. Anledningen är att MS har stängt denna möjlighet för de tycker det är en säkerhetsrisk...

Hittade ett php-script som sade sig fixa detta även med senaste IE-uppdateringen men det funkade inte det heller tyvärr. Är det någon som fixat lösning på detta så skulle det vara suveränt om ni kan visa hur.

I nuläget blir det så att de som har denna version av IE först får logga in med JavaScript-formuläret och sedan måste logga in en gång till i det grå htaccess-formuläret. Grymt irriterande och typiskt Microsoft att komma med sin egen lösning vilken i detta fallet försvårar för utvecklaren.

I och med att majoriteten av webanvändarna kör IE på Windows och att de dessutom uppdaterar i löpande takt måste man ju ha en lösning som funkar även för dessa. (Tidigare versioner av IE för Windows funkar fortfarande lika bra som andra browsers)

  • Oregistrerad
  • 2004-10-04 18:23

Vadå går det bara att skydda webbsidor? Dvs .php osv? Inte pdf-filer mm? Det låter konstigt... ALLT i den mappen borde ju vara skyddat!!

  • Medlem
  • Göteborg
  • 2004-10-04 19:42
Ursprungligen av torbjorn2000:

Vadå går det bara att skydda webbsidor? Dvs .php osv? Inte pdf-filer mm? Det låter konstigt... ALLT i den mappen borde ju vara skyddat!!

Jovisst, med htaccess blir allt i önskad mapp skyddat, vad jag menar är att detta inte går med PHP. Anledningen att jag vill använda PHP är att det är så mycket smidigare med administration av olika användare om man inte vill ha ett och samma user ID + att inloggningen blir snyggare med riktigt formulär istället för fulrutan. Håller på och kikar på vad man kan göra åt det och återkommer om jag hittar något.

  • Oregistrerad
  • 2004-10-04 18:39

Testade, det verkar som allt i mappen blir skyddat, precis som jag ville!

Men som sagt det måste ju gå att gå runt den där fula log-in-rutan? Kan man inte i PHP-kod sätta att användaren är autentiserad?

  • Oregistrerad
  • 2004-10-04 19:57

Jag har inte lyckats få det att fungera, login-rutan dyker upp men jag lyckas aldrig skriva in rätt lösenord.. Och ja, jag har encryptat lösenordet! Hmm...

Men hittade just på en ganska smidig mellanlösning, som nästan är bättre: Lägg alla skyddade filer i den skyddade .htaccess-mappen, men använd PHP för att läsa filerna därifrån! Då kan man få snygg form-login med html och PHP och sedan låta php skicka filerna till dig. Och det går itne att skriva in URLen direkt för då måste man ha lösen (som jag inte fått att funka, men whatever)

  • Medlem
  • Stockholm
  • 2004-10-05 11:12

Ha en .htaccess-fil i den mapp du vill skydda alla filer i. Men använd .htaccess-filen till att skriva om ALL trafik (med mod_rewrite och RewriteRule) till en index.php som du lagt i samma mapp (således, all trafik förutom index.php ska vidarebefodras till index.php)

Sedan i index.php kan du i lugn och ro kontrollera om användarn är inloggad eller inte, och efter det kontrollerar du adressenraden och vilken fil användarn ville komma åt (mod_rewrite skriver alltså inte om adressraden utan skriver endast om den internt hos apache). När du kontrollerat att användarn får hämta hem filen så kan index.php ändra content-type och inkludera filen.

  • Oregistrerad
  • 2004-10-08 09:01
Ursprungligen av ivar:

Ha en .htaccess-fil i den mapp du vill skydda alla filer i. Men använd .htaccess-filen till att skriva om ALL trafik (med mod_rewrite och RewriteRule) till en index.php som du lagt i samma mapp (således, all trafik förutom index.php ska vidarebefodras till index.php)

Hur fungerar mod_rewrite och RewriteRule? Är det konfigurering i severn, eller är det möjligt att göra även om man ligger på etty webbhotell?

  • Medlem
  • Göteborg
  • 2004-10-08 09:28

Det fixar du genom att skapa en fil som heter .htaccess som du lägger i den mapp du vill skydda. Skriv exempelvis:

RewriteEngine on
RewriteRule ^(.*)$ koll.php

Ovanstående rewriterule innebär att all trafik till någon fil i aktuell mapp styrs om,
(görs med koden ^(.*)$) till filen (koll.php).

  • Medlem
  • Stockholm
  • 2004-10-08 09:38
Ursprungligen av torbjorn2000:

Hur fungerar mod_rewrite och RewriteRule?[...]

Bra 'kom igång'-läsning

  • Medlem
  • Göteborg
  • 2004-10-06 12:07

Grymt! Funkar perfekt. Tackar.

  • Oregistrerad
  • 2004-10-08 09:49

Ja, .htaccess har jag mer eller mindre koll på (förutom att jag inte lyckats få den att hitta/förstå/bry sig om min .htpasswd-fil). Det där verkar vara en bra lösning, tack!

(och tänk att jag missat den artikeln på ala!!)

Det ska väl tilläggas att mod_rewire är ett tillägg till Apache, så det fungerar inte på en webbserver som IIS. (Eller finns det tillägg till IIS som imiterar detta?)

  • Medlem
  • 2004-10-25 22:41

En annan variant är ju att du skapar en mapp som du inte tillåter läsning från webben i (med htacces deny all elelr vad det nu var), sedan har du ett php dokument som hämtar filen, och skriver ut den, berooende på om man är inloggad eller ej. Ett tipps är ju att hålla lite ordning på filerna i databasen så du slipper hanskas med dumma filnamn.
Har erfarenhet av att man kan fula sig (om man låter andra ladda upp filer) , så spara det filnamn du vill ha på filen i databasen och en härledning till filen, som sedan phpdokumentet hämtar.

Lite lagom rörigt hoppas du förstår hur jag tänker.

  • Oregistrerad
  • 2004-10-26 08:34

Jo det är ungefär så jag har löst det nu. Jag har en htaccess-skyddad del av webbkontot som jag hämtar filer ifrån med PHP, beroende på om anv är inloggad eller inte. Databaslagring har jag inte börjat med ännu, vet inte om jag ska göra det!

  • Medlem
  • 2004-10-26 12:48

Jag har kört mycket filer i databaser i mitt tidigare liv.. men det är mycket som talar emot att göra det och en del fördelar.
Fast den största nackdelen enligt mig är att MySQL i standard konfig har en query buffert på 1Mb som gör att du inte kan få in en större fråga än en megabyte. (Iaf är det så på de flesta konfigurationer av MySQL på de platformar jag hunnit avverka).
Fördelen är kanske just att man kan få ut filer direkt ifrån queris utan att behöva göra query, läas in fil och sedan visa. Fast jaja.. för mindre filer.. kanske för stora filer inte.. är kanske min sammanfattning.

1
Bevaka tråden