Jag har ett upload-script i PHP. Det fungerar hur bra som helst, men hur är det med säkerheten egentligen..?? Filen laddas upp i en katalog, och endast den som har loggat in kan se den i listan. MEN, vet man eller kan gissa sig till filnamnet så kan man ju utan att logga in öppna filen genom att skriva in URL:en i webbläsaren..!
Har någon en bra lösning på detta problem? Alla förslag mottages med tacksamhet!
Uhm, du kan ju lösa det så att när man är inloggad öppnar man filen genom att första hämta sökvägen i databasen.
Annars, för att folk inte ska kunna ladda hem filerna, är väl en lösning att lägga dem utanför rooten.
Hmm, ja filens namn och sökväg ligger lagrad i en databas men sökvägen till, låt säga bilden, syns ju antingen i webbläsarens adressrad ("www.sidan.se/filer/bild.gif") eller i källkoden ("...img src=filer/bild.gif...") när den är öppnad...
Ett alternativ kanske skulle vara att ändra sökvägen (filnamnet), både i databasen och själva filens namn, varje gång någon öppnar den... Känns dock lite omständigt.
du kan ju skicka filen till användaren via ett PHP-skript.
Du skickat med ett ID-nummer till PHP-skriptet som sedan skicka filen till användaren.
Tänk på att du inte ska göra någon "redirect" utan läsa in filen och sedan skicka innehållet till användaren. Ska du skicka t.ex. bilder måste du ändra i headern. Du bör spara filerna utanför rooten till webservern så man inte kan komma åt dem. Du kan även lägga in htaccess som block för en viss katalog men jag vet inte hur säkert det är.
Kommer inte ihåg vad man ska skriva men det vet säkert andra.
När någon försöker komma åt ditt PHP-skript kan du kontrollera om användaren är inloggad och har rättigheter att hämta just den filen.
Tänk dock på att det blir mer belastning för servern att göra så här än att ha filerna liggande så man kan nå de direkt på servern.
Jag skulle personlige rekommendera en .htaccess-fil. Då kan bilderna ligga i en underkatalog till scriptet och på så sätt få fin ordning på servern. Det borde väl räcka med
deny from all
i filen för att ingen ska kunna få tillgång till någon bild.
Har fortfarande inte kommit någon vart med detta problem. Hur gör "de stora" vad gäller säkerhet i filuppladdning/nedladdning(så att endast de som har en viss behörighet kan komma åt)? Det The_Hulk skrev verkar ju smart, kan någon ge mig ett konkret exempel?
exemplet lägger även på en vattenstämpel .. där du ex kan ha sitens namn lr dyl..
om användaren inte har access visas filen ingenAccess.gif istället ..
2. Funkar detta även för andra filtyper (tex .doc, .pdf, .xls)?
3. Om nu någon lyckas lista ut vilken mapp som filerna ligger i så är det ju bara att testa sig fram till filnamnet, tex "www.sidan.se/mapp/filnamn.pdf". Eller kan man låsa detta på ngt sätt, så det bara går att nå filerna via scriptet?
4. Jag förstår att det tar längre tid att ladda (tex en bild) med denna metod, men är det märkbart?
Vilket tillvägagångssätt rekomenderar ni för detta ändamål till ett större community med relativt många användare samtidigt? Vanligaste filtyperna kommer förmodligen vara jpg och doc.
2. ja .. du får ändra headern till korrekt för det bara så.. kan även va bra att ex då använda header('Content-Disposition: attachment; filename="downloaded.pdf"') http://se.php.net/manual/sv/function.header.php
fast det där är inte utanför wwwrooten ..
det jag menade var att du ex kanske har en mapp som heter ex /home/dindomän.se/www/ .. går du in på http://www.dindomän.se/ så kommer du till den mappen ..
de bilder som du vill skydda kan du då ha i en mapp utanför , ex /home/dindomän.se/minaskyddadebilder/ .. php skriptet kan fortfarande läsa in bilderna men det går inte i direkt genom webbläsaren komma åt filerna.
fast det där är inte utanför wwwrooten ..
det jag menade var att du ex kanske har en mapp som heter ex /home/dindomän.se/www/ .. går du in på http://www.dindomän.se/ så kommer du till den mappen ..
de bilder som du vill skydda kan du då ha i en mapp utanför , ex /home/dindomän.se/minaskyddadebilder/ .. php skriptet kan fortfarande läsa in bilderna men det går inte i direkt genom webbläsaren komma åt filerna.
OK, men hur når man bilderna genom php-scriptet då? Om det går så borde det ju också gå via webbläsaren...Eller?? Hur funkar det?
OK, men hur når man bilderna genom php-scriptet då? Om det går så borde det ju också gå via webbläsaren...Eller?? Hur funkar det?
php har tillåtelse att läsa filer utanför wwwrooten..
säg att din wwwroot/documentroot är ex /home/learn/public_html/
går folk in på din sida ex https://www.dinsida.se/ så kommer de till din documentroot, de har där ingen möjlighet att gå högre upp i ditt filträd.
dock kan du med ett php skript läsa filer som ligger högre upp m.m
Själv har jag löst problemet genom att när en fil laddas upp så kör jag md5 med ett slumpat unikt id och spara den uppladddade filen med det namnet. Det är i stort sett omöjligt att luska ut vad filerna heter. Sen kör jag ett PHP script som anropas och sänder filen till användaren.
Okej, jag börjar hajja hur man kan göra. Hittade följande på php.net:
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
Här öppnas ju en PDF va jag förstår. Men låt säga att jag inte vet vilken typ av fil som användaren vill visa. Det kan vara en bild av olika typer (jpg, jpeg, gif, png) och det kan vara ett dokument av olika typer (pdf, txt, doc, xls). Hur ska jag på ett snyggt sätt tillverka en funktion/skript som utifrån "anropet" tar reda på vilken typ av fil det är och sedan öppnar/visar den.
Någon som vill hjälpa mig? Vore oerhört tacksam!!! :bire :bire :)
**/red #1 efter lite eftersökning hittade jag en annan lösning , har testat o verkar fungera.
/red #2 visade sig att system file osv tryckte ut ett svar.. skrev om funktionen lite, fångade upp utskriften och rensade den..
Obs .. denna lösning intefererar troligen med tidigare ob_ buffers.. har inte testat så**
$content = getMimeType($filename);
header ("Content-type: $content");
function getMimeType($filename) {
ob_start();
if (function_exists("mime_content_type"))
$return = mime_content_type($filename);
else
$return = system ( trim( 'file -bi ' . escapeshellarg($filename)));
ob_end_clean();
return $return;
}
137 ms totalt · 3 externa anrop · v20260731065814-full.55e59744