webForumDet fria alternativet

Skydda uppladade bilder och filer

PHPur PHP

10 svar · 1 660 visningar · startad av webbo

Medlem sedan maj 201131 inlägg
Frågan#1

Jag bygger ett litet community där folk kan ladda upp bilder och filer som sedan skyddas med önskad behörighetsnivå. Man kan alltså bestämma vem/vilka som ska kunna se bilden eller ladda hem filen. Jag vill ha hög säkerhet på det hela. En oinloggad obehörig person ska alltså inte kunna kika på en skyddad bild t.ex. genom att manuellt skriva in adressen https://www.mitt-community.se/uploads/bilder/125321.jpg. Alla uploads sparas med ett id-nr och dess behörighetsnivå i databasen.

Hur löser jag detta på bästa sätt? Jag ser två alternativ:

1. Ha ett väldigt långt och krångligt "kryterat" namn på bildena, t.ex. en md5 på bildens id: https://www.mitt-community.se/uploads/bilder/jdj56211nms238jds38983nfkaovnv11.jpg.

Fördel: Snabbt.
Nackdel: Inte helt säkert, man kan ju chansa sig till bilders namn, ingen kontroll av behörighet.

2. Låta bilderna hämtas av ett script, typ https://www.mitt-community.se/bild.php?id=125321.

Fördel: Säkert, jag kan checka bildens behörighet mot den inloggade användaren.
Nackdel: Långsamt? Ingen cachning?

Kom gärna med synpunkter och förslag.

Tack!

Medlem sedan aug. 20039 342 inlägg
#2

Du måste använda dig av 2 för att få den behörighetskontroll du vill. Annars kan ju den som vill sprida adressen. (Ingen gissning nödävändigt.)

Eftersom du måste göra ett databasanrop för att kolla behörigheten så blir det lite långsammare än att bara anropa en bildfil i en katalog. Men nödvändigt som sagt.

Dock kan du få webbläsaren att cacha bilderna genom att skicka headers om detta. Du kan också få URLen att se lite snyggare ut med .htaccess och rewrites. Då kan du t ex göra så att när https://www.mitt-community.se/bilder/125321.jpg anropas så skrivs det om till https://www.mitt-community.se/bild.php?id=125321 internt och du får samma funktionalitet under huven.

Medlem sedan juli 2003555 inlägg
#3

Vet inte om det låter sig göras i PHP, men i ASP.NET är det mer eller mindre inbyggt och du kan kontrollera åtkomst och behörigheter relativt enkelt i web.config och/eller med kod, och fortfarande få alltihopa serverat direkt ifrån IIS med allt vad pipes och cache heter.

Behörigheter och liknande kan du med fördel cacha i t.ex. sessionstaten, krypterat i en cookie etc. för att minimera antalet databasanrop.

Medlem sedan maj 201131 inlägg
#4

Tack för era svar! Jo, det lutar mot alt. 2. Att sedan snygga till URLen på det sätt du, nitro, beskriver låter ju najs! Är det så Facebook gjort måntro, för där tycks ju alla bilder (även de man uppfattar som skyddade) serveras utan något php-script..? För visst måste de kolla behörighet? Annars är ju deras "Dela-endast-med"-funktion ganska menlös...

Medlem sedan maj 201131 inlägg
#5

Nej, Facebook kontrollerar inte behörighet!! Jag provade ladda upp en bild till min profil och valde "Dela med: Anpassade - Bara mig" kollade sedan källkoden och kopierade bildens url https://fbcdn-sphotos-a.akamaihd.net..._3320958_n.jpg (nu borttagen) och klistrade in i en annan webbläsare där jag aldrig varit inloggad Facebook. Vips, bilden syns där med... Hmm, hur har de tänkt där...

Medlem sedan maj 201131 inlägg
#6

Ingen annan som tycker det är konstigt att Facebook "skyltar med" att man skyddar sina bilder men att de sedan går att nå på ovanstående sätt...??

Medlem sedan maj 201131 inlägg
#7

nitro2k01 skrev:

Dock kan du få webbläsaren att cacha bilderna genom att skicka headers om detta. Du kan också få URLen att se lite snyggare ut med .htaccess och rewrites. Då kan du t ex göra så att när https://www.mitt-community.se/bilder/125321.jpg anropas så skrivs det om till https://www.mitt-community.se/bild.php?id=125321 internt och du får samma funktionalitet under huven.

Se min nya tråd i detta ämne: http://www.webforum.nu/showthread.php?t=183679. Tacksam för hjälp!

Medlem sedan maj 201131 inlägg
#8

webbo skrev:

Ingen annan som tycker det är konstigt att Facebook "skyltar med" att man skyddar sina bilder men att de sedan går att nå på ovanstående sätt...??

Ingen som tycker det är konstigt? Jag blir lite förbryllad...

Medlem sedan aug. 20039 342 inlägg
#9

webbo: På den skalan som FB arbetar skulle det bli ganska resurskrävande att ha "riktigt" skydd. Man använder akamai, ett CDN, eller content dellivery network. Man laddar upp filer och de kan nås snabbt på en angiven adress, men i gengäld får man ingen finkornig kontroll över filrättigheterna.

Medlem sedan nov. 2006188 inlägg
#10

är det så dem ska köpa den och sedan få access till den, så är det säkraste sättet lägga filerna utan för root mapen så dem inte kan komma åt den via http eller likande, och vid ett köp så flyttar du filen till en viss ställe på http skapa en url för ner laddning efter han har laddad ner den klickad på länken så tar du bort filen från http stället och vid nästa köp så flyttar du den igen.

Medlem sedan juli 2003555 inlägg
#11

Nja, säkraste är det inte, säkraste är att antingen lagra dem utanför rooten, och sedan streama dem via ett script som kontrollerar rättigheterna, alternativt lägga dem åtkomliga, men styra åtkomsten programmatiskt i webbservern. Att göra som du föreslår är ganska knöligt - hur vet man när filen är nerladdad? Hur stoppar man att flera laddar ner samma fil?

140 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)