PHP: Beskyttelse af uploadede filer

Tags:    php

Hej alle,

Jeg er ved at programmere et system, hvor der brugeren skal kunne uploade filer. Men da der kan være flere brugere på systemet og disse filer kan være sårbare, vil jeg gerne opnå kendskab til hvordan man kan beskytte disse uploadede filer. Er det muligt at sætte dem krypteret i en database (også selvom de måske fylder 8MB eller betydeligt mere), eller hvordan skal sådan én klares?

På forhånd tak.



8 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Er den nemmeste måde ikke at ændre CHMOD i din upload mappe så den ikke kan tilgåes af brugerne men kun serveren selv. Derefter burde du kunne streame filen gennem PHP. På den måde kan brugerne ikke komme til andres filer og du slipper for at skulle gemme hele filer i din database



Jeg vil give Steffen ret, og så tjek lige lidt op på dine setting på Apache Server (Hvad jeg går ud fra at du kører) og evt. et kig på .htaccess.

http://felipecruz.com/blog_disable-directory-listing-browsing-apache.php
Og bedre:
http://www.htaccess-guide.com/index.php?a=14



En helt anden løsning som jeg har brugt en gang, var at gemme filen på serveren på helt almindeligvis, men i en mappe som brugerne ikke lige kan regne ud eller en mappe som webserveren ikke kan få fat i.
I din database har du så et unikt id fx et MD5 hash, og så filnavnet, bruger id og størrelse på filen.

Så laver du bare et script som læser filen højt fra browseren, så kan brugeren nemlig ikke se hvor filen er på serveren, og kan kun se den PHP-fil de forespørger.

Stien til filen kunne se ud som dette: http://side.dk/download.php?file=18430ae620ecf2b196895985f1096cab

Eksempel på download.php:
Fold kodeboks ind/udKode 


Dette er bare lige et udkast og lidt kode fra et gammelt script, så der er sikkert nogle som kunne pege fingre af det og komme med ændringer.
Har ikke tjekket om det virker, men er bare lige skrevet som et "forslag som du kunne arbejde videre på".



Indlæg senest redigeret d. 06.07.2009 17:40 af Bruger #4265
Hvis brugerne ikke må kunne hente de andres uploadede filer, så vil jeg lave et fremmed id der binder den uploadede fil sammen med dens bruger. Og når en bruger så downloader en fil tjekker du fremmed id'en med brugerens id.

Jeg er ikke klar hvor effektivt dette er, men det finder du vel ud af.



Hvis brugerne ikke må kunne hente de andres uploadede filer, så vil jeg lave et fremmed id der binder den uploadede fil sammen med dens bruger. Og når en bruger så downloader en fil tjekker du fremmed id'en med brugerens id.

Jeg er ikke klar hvor effektivt dette er, men det finder du vel ud af.


Ja, det ville fungere inden for PHPs rammer :)

Det jeg tænker er, at hvis man har uploaded en fil til www.eksempel.dk/upload/ - så vil andre brugere kunne hente en af de andres filer, alene ved at få et hurtigt indeks over upload-mappens indhold.

Så det jeg søger er egentlig hvordan jeg får PHP til at beskytte filerne og deres indhold på en sådan måde at man heller ikke "uden om PHP" kan hente disse filer.



Bare smid en index fil i den mappe Mark.

Evt. beskyt filerner med ip



Du kan også gøre som Morten skriver. For at gøre det svære yderligere for at "ramme" en fil så kan du lave random filnavne, og så gemme original navn i databasen samt filens random navn.

Morten: Jeg ved ikke lige hvordan du vil administrere ip adresserne, desuden går det smarte af det hvis man skal kunne hente sine egne filer alle steder fra.



Indlæg senest redigeret d. 05.07.2009 12:54 af Bruger #6559
Men for at besvare dit oprindelige spørgsmål, så ja, det kan godt lade sig gøre at smide filerne i databasen. Jeg har ingen felterfaring med den slags, men min gut feeling siger mig at du skal hente filens indhold med file_get_contents($stitilfil); og at dette indhold skal smides ind i en tabelcelle af typen BLOB.

Kryptering er egentlig ikke nødvendigt, men hvis du gerne vil være 5000% sikker på at filerne ikke kan nakkes af andre, så kan du kigge på mcrypt http://dk.php.net/mcrypt

Vær opmærksom på at når du har så store filer i databasen, så kan det meget hurtigt blive en kostbar affære at søge i den. Sørg for at den database du bruger er 110% optimeret med de rigtige indexes og relationer. Det helt optimale ville være hvis databasen over filer lå på en helt seperat databaseserver fremfor at ligge i samme database/på samme server som resten af dit systems data ligger på. Nu ved jeg ikke hvor mange brugere du skal skalere til, og hvor meget plads du regner med at give hver bruger. Bare hav i tankerne at det ikke kun er harddisk plads, men også hukommelse og CPU-tid, så store filer i databasen kommer til at have betydning for. Men det er naturligvis den bedste vej at gå, hvis du gerne vil have meget høj sikkerhed.

EDIT: og sørg for at PHP har masser af RAM til rådighed (der er en max allokeret RAM i php.ini), for at åbne, kryptere og gemme så store filer kræver naturligvis en masse RAM, også på PHP-niveau under selve uploadfasen.



Indlæg senest redigeret d. 05.07.2009 12:57 af Bruger #8223
t