webForumDet fria alternativet

Skydda filer - tips & hjälp eftersökes!

PHP

25 svar · 989 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Jag har ett upload-system där jag vill skydda alla filer. Med skydda menar jag att man endast skall kunna nå filerna genom min sida. Därför läggs alla uppladdade filer i en mapp "filer" som ligger utanför rooten. Sedan så hämtar jag filerna mha ett php-script, fil.php:

// Där filerna ligger
$mapp = '../filer/';

// Sökvägen
$filen = $mapp.$_GET['fil'];

$filtyp = explode('.',$_GET['fil']);
$filtyp = $filtyp [1];
		
// Filtyp
switch($filtyp ) {

case "avi":     $type = "video/x-msvideo";               break;
case "doc":     $type = "application/msword";            break;
case "jpg":     $type = "image/jpg";                     break;
case "jpeg":    $type = "image/jpg";                     break;
case "mp3":     $type = "audio/mpeg";                    break;
case "mpg":     $type = "video/mpeg";                    break;
case "mpeg":    $type = "video/mpeg";                    break;
case "pdf":     $type = "application/pdf";               break;
case "png":     $type = "image/png";                     break;
case "gif":     $type = "image/gif";                     break;
case "txt":     $type = "text/plain";                    break;
case "wav":     $type = "audio/wav";                     break;
case "zip":     $type = "application/x-zip-compressed";  break;
			
default:        $type = "application/force-download";    break;
}
		
// Öppna filen
header('Content-Type: '.$type);
header('Content-Disposition: attachment; filename="'.$_GET['fil'].'"');
header('Content-Length: '.filesize($filen));
readfile($filen);

För att visa/öppna en fil:

<img src="fil.php?fil=dokument.doc" />

Detta tänkte jag skulle räcka säkerhetsmässigt med tanke på att man inte kommer utanför rooten på egen hand... Sen kom jag på, det är ju bara för "boven" att skriva in adressen https://www.minsida.com/fil.php?fil=dokument.doc i webbläsaren...!

Hur ska jag göra för att skydda mina filer? Alla tips mottages med tacksamhet!

Medlem sedan okt. 20001 285 inlägg
#2

.htaccess ?

Medlem sedan jan. 20051 130 inlägg
#3

Jag har funderat på det jag också, men inte kommit på hur jag skall använda den... Tips, exempel?? Tack!

Medlem sedan juni 20031 837 inlägg
#4

användarnamn och lösenord i PHP?
egentligen skulle det räcka med en kod/lösenord för att komma åt filen.
du får då ha ett forumlär där man skriver in lösenordet.

Medlem sedan jan. 20051 130 inlägg
#5

The_Hulk skrev:

användarnamn och lösenord i PHP?
egentligen skulle det räcka med en kod/lösenord för att komma åt filen.
du får då ha ett forumlär där man skriver in lösenordet.

Man ska inte behöva logga in... Vissa filer ska vara synliga för alla, men man ska behöva ha länken i mitt system för att komma åt dem.

Det där med .htaccess kanske kan vara något, men hur ska jag göra??

R: Hur menar du The_Hulk förresten? Vart skulle jag ha detta "lösenords-formulär"? Det går ju inte att placera det i fil.php, och har jag det inte där så kommer man ju åt fil.php utan lösenord... Tror du tänkte lite fel där.

Medlem sedan juni 20031 837 inlägg
#6

Tror det ska fungera något åt detta hållet.
du kan även skicka med koden som en parameter till fil.php om du vill
fil.php?fil=document.doc&code=hemligt
skickar du inte med code så får man en ruta där man ska mata in koden.

<?php
session_start();

if(isset($_REQUEST['code']) && $_REQUEST['code'] == "hemligt")
{
    // lägg din kod här om man matat in rätt kod.
    $fil = $_SESSION['fil'];
}
else
{
    $_SESSION['fil'] = $_REQUEST['fil'];
?>
<html>
<body>
<form action="fil.php" method="post">
Kod: <input type="password" name="code"> <input type="submit" value="Send">
</form>
</body>
</html>
<?php
}
?>
Medlem sedan juni 20031 837 inlägg
#7

om du använder databas så man du även skicka med ett slumpmässigt ID med varje länk som är giltligt en viss tid. kanske slumpa fram det för varje länk eller för varje användare som surfar till din sida.

tänk på att detta medför att dina användare måste tillåta cookies.

skulle i och för sig fungera att skicka med ID till varje sida och på det sättet undvika cookies.

Medlem sedan jan. 20051 130 inlägg
#8

Nu har du väl fel The_Hulk. Jag kan inte stoppa in ett formulär i fil.php. Det ända fil.php får innehålla är bild-information, dvs en header efter som "anropet" sker direkt i <img>-taggen. Man kan inte visa ett formulär i en bild...om du förstår vad jag menar :)

Att dessutom skicka med ett lösenord mha "code=..." är ju inte så smart då lösenordet visas för besökaren (högerklick - visa källkod).

Är det verkligen ingen på hela wF som vet hur man kan och brukar göra i dessa fall. På något sätt borde det ju gå att skydda sina filer...??

Tack på förhand!

Medlem sedan mars 20025 907 inlägg
#9

Se till så det sätts en session när folk surfar runt på dina sidor. Sen kontrollerar du om sessionen finns innan du skickar filen till besökaren i fråga.

Alternativt: http://www.google.se/search?hl=sv&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=htaccess+hotlink&spell=1

Medlem sedan jan. 20051 130 inlägg
#10

Peeer skrev:

Se till så det sätts en session när folk surfar runt på dina sidor. Sen kontrollerar du om sessionen finns innan du skickar filen till besökaren i fråga.

Alternativt: http://www.google.se/search?hl=sv&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=htaccess+hotlink&spell=1

Tack för din hjälp. Sessionen verkar inte hittas i filen fil.php. Följande funkar inte, bilden visas inte:

<? $_SESSION['test'] = 'ok'; ?>

<img src="fil.php?fil=dokument.doc" />
// Där filerna ligger
$mapp = '../filer/';

// Sökvägen
$filen = $mapp.$_GET['fil'];

$filtyp = explode('.',$_GET['fil']);
$filtyp = $filtyp [1];
        
// Filtyp
switch($filtyp ) {

.
.
.

}
        
// Öppna filen om säkerhets-session är satt
if ($_SESSION['test'] == 'ok') {

  header('Content-Type: '.$type);
  header('Content-Disposition: attachment; filename="'.$_GET['fil'].'"');
  header('Content-Length: '.filesize($filen));
  readfile($filen); 
}

R:
Är det här med .htaccess verkligen så smart/säkert?

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpe [L]

HTTP_REFERER innehåller väl inte alltid ngt och kan väl dessutom fejkas? Eller gäller det bara php's $_SERVER['HTTP_REFERER']?

Medlem sedan mars 20025 907 inlägg
#11

Du måste ha session_start() överst på alla sidor!

<?php
session_start();
$_SESSION['test'] = 'ok'; ?>

<img src="fil.php?fil=dokument.doc" />
Medlem sedan mars 20025 907 inlägg
#12

learn skrev:

R:
Är det här med .htaccess verkligen så smart/säkert?

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpe [L]

HTTP_REFERER innehåller väl inte alltid ngt och kan väl dessutom fejkas? Eller gäller det bara php's $_SERVER['HTTP_REFERER']?

Nej det är inte helt säkert, men det stoppar en hel del. Jag hade kört på sessionkontrollen.

Medlem sedan juni 20031 837 inlägg
#13

Vad jag menade var att när man försöker komam åt bilden utan att ha matat in koden så kommer man till ett forumlär där man ombeds att skriva in koden.
formuläret kommer inte i bilden eller något dokument.
fil.php kan returnera vad som helst. jag hade markerat var du skulle lägga in din kod för att ta hand om själva skickandet av dokumentet/bilden till användaren. det är nog inget fel i lösningen men tydligen inte riktigt det du ville ha.

Medlem sedan jan. 20051 130 inlägg
#14

Peeer skrev:

Du måste ha session_start() överst på alla sidor!

<?php
session_start();
$_SESSION['test'] = 'ok'; ?>

<img src="fil.php?fil=dokument.doc" />

Ah, dumma mig... :p

Tack för tipset! En fråga bara: går det inte att spåra vilka sessioner som sätts på en webbsida man besöker..??

Fler tips, ngn?

Medlem sedan mars 20025 907 inlägg
#15

learn skrev:

En fråga bara: går det inte att spåra vilka sessioner som sätts på en webbsida man besöker..??

Nja, värdet på sessionerna ligger enbart på webbservern, däremot så lagras oftast ett sessionID hos klienten i en cookie (sessionIDt kan ligga i sökvägarna också). Värdet på sessionIDt går att förfalska, men för att man ska ha någon nytta av det så måste man veta/gissa sig fram till vad någon annan besökare har för sessionID (för att på så sätt kapa dennes session).

Medlem sedan jan. 20051 130 inlägg
#16

Ok, och detta är komplicerat hoppas jag...?

Medlem sedan juni 20031 837 inlägg
#17

Vill man förbättre säkerheten med sessionid kan man även spara IP-nummret från personen. $_SERVER['REMOTE_ADDR'], du kanske även kan hitta ltie mer information här: http://se2.php.net/reserved.variables

komplicerat att ändra sessionid eller att gissa någon annans?

Medlem sedan jan. 20051 130 inlägg
#18

The_Hulk skrev:

Vill man förbättre säkerheten med sessionid kan man även spara IP-nummret från personen. $_SERVER['REMOTE_ADDR'], du kanske även kan hitta ltie mer information här: http://se2.php.net/reserved.variables

Låter intressant. Hur exakt menar du? Kan du ge ett litet exempel? Tack!

The_Hulk skrev:

komplicerat att ändra sessionid eller att gissa någon annans?

Båda (komplicerat/svårt)?

Medlem sedan mars 20025 907 inlägg
#19

learn skrev:

Ok, och detta är komplicerat hoppas jag...?

Det krävs lite kunskap för att byta sessionid, men det svåra är inte att byta, utan att kunna gissa sig fram till ett annat giltigt.

Medlem sedan jan. 20051 130 inlägg
#20

Peeer skrev:

Det krävs lite kunskap för att byta sessionid, men det svåra är inte att byta, utan att kunna gissa sig fram till ett annat giltigt.

Ok, vad kan jag mer göra för att få det så säkert som möjligt?

273 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)