webForumDet fria alternativet

Förhindra nedladdning av filer i webbshop

PHP

7 svar · 544 visningar · startad av tHorSeYE

Medlem sedan juli 200255 inlägg
Frågan#1

Jag hade tänkt att bygga en webbshop där man ska kunna köpa främst bilder (för nedladdning). Finns det några bra regler för hur man bör göra för att förhindra direkt nedladdning av filerna i fråga (t.ex. om man känner till sökvägen till filen)? Hur skyddar man dem på bästa sätt? Sköter man det genom inställningar i webservern?

I vilket fall, det jag är ute efter är att man enbart ska kunna ladda ner filerna genom att klicka på en länk i min webshop. Hur görs detta på bästa sätt?

Min fråga har säkert blivit besvarad innan, men jag hittade inte riktigt vad jag söker.

Medlem sedan maj 20012 237 inlägg
#2

Placera filerna utanför webroten eller så skyddar du mappen med htaccess.

Sedan så kör du ett PHP-script som med hjälp av header() streamar filen till klienten.

Här är ett snabbt exempel på hur man kan göra:

header("Content-Disposition: atachment; filename=$filename");
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize("$path/$filename"));
header("Pragma: no-cache");
header("Expires: 0");
$fp=fopen("$path/$filename","r");
print fread($fp,filesize("$path/$filename"));
fclose($fp);
exit();

Mer om header()

https://www.php.net/header

OBS. Exemplet jag gav är ett generellt sätt att ladda ned filer. Viktigt är att använda rätt sorts content type. Om du vill ladda ned bilder så vet jag inte om application/octet-stream är rätt. Då lämpar sig nog image/xxxx bättre (xx står för t ex jpeg, gif).

Medlem sedan juli 200255 inlägg
#3

Ah, trevligt och smart!

Bara en snabb kommentar innan jag börjar ta tag i det på riktigt:
Med "utanför webroten" menar du i en mapp högre upp i mappstrukturen? Utan att ha testat känns det som att det kan vara lite lurigt att få ladda upp filer via webbläsaren till en sådan mapp, men det kanske inte brukar vara några problem?

Medlem sedan maj 20012 237 inlägg
#4

Ja, för att förhindra atta ingen kan komma åt dina filer så måste du antingen skydda dem med t ex htaccess eller liknande eller så har du filerna utanför webbroten. Har du dem utanför webbroten så kommer webbläsaren inte åt dem.

Exempel:

/usr/local/apache2/htdocs/my_fancy_web2_app/wwwroot/ <-- publika katalogen somn webbläsaren kommer åt (bilder, css och js)
/usr/local/apache2/htdocs/my_fancy_web2_app/data <-- oåtkomligt för webbläsaren (här kan du ha underkataloger för diverse saker, bl a filer som du vill tillgodoge till vissa personer).

Sedan kan du konfigurera webbservern så att t ex http://localhost/olle pekar mot /usr/local/apache2/htdocs/my_fancy_web2_app/wwwroot/

Sen vilket som är bäst låter jag dig och/eller någon annan att avgöra.

Filerna som laddas upp av en webbläsare brukar lagras i systemets temp-katalog ( t ex i unix-världen är det ofta /tmp). Det är upp till ditt program att flytta filen till rätt ställe (http://fi.php.net/manual/en/function.move-uploaded-file.php och http://fi.php.net/manual/en/function.is-uploaded-file.php).

Detta har ju inget att göra med nedladdning av filer.

Medlem sedan juli 200255 inlägg
#5

Nej, det har inget direkt med nedladdning att göra, men med helheten att göra.
I vilket fall, det var bara en tanke jag slängde ut och jag fick svar på mina frågor. Tack!

Medlem sedan maj 20012 237 inlägg
#6

Jovisst, en viktig fråga.

Glöm inte att tänka på säkerheten när du tillåter användare att ladda upp filer (när detta blir aktuellt).

Medlem sedan juli 200255 inlägg
#7

Absolut, säkerhet är hög prio. Jag är dock rätt grön på det området i nuläget, har väl tänkt att läsa på en del innan sjösättning av projektet så att säga. Fast det kanske finns några gyllene regler som man bör ha koll på här också?
Att kolla vilka filtyper som laddas upp och att användaren är inloggad är väl självklart, men andra små tips tar jag gärna emot!

Medlem sedan maj 20012 237 inlägg
#8

Lita inte på vad formulärets MAX_FILE_SIZE är då den kan användaren ändra.

Sedan kan det också vara farligt att lita på filändelsen. Det finns funktioner för PHP som kan hälpa dig att se om en bild verkligen är en bild.

http://php.about.com/od/advancedphp/qt/upload_security.htm
http://fi.php.net/features.file-upload <- läs denna!!

335 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
205 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)