Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  9 762
Hei,

Så jeg lager en script og laster opp flere filer til serveren samtidig som jeg lager referanse (link) i en database.

Når en person logger seg på, kan personen få tilgang til disse linkene. Det jeg lurer på er om det er mulig å ha en condition på fil-nedlastingen? For eksempel jeg vil se om en session eksisterer før jeg tillater personen å laste ned filen, hvis ikke session eksisterer vil jeg ikke tillate nedlastingen og sende personen til helvette.

Er der noen bedre løsninger? Tar gjerne imot link til lesestoff.

Edit! Also session med tanke på at folk som ikke er pålogget ikke får lov til å laste ned filene

Mange takk
Sist endret av 852; 12. januar 2012 kl. 17:57.
Hvis jeg har forstått deg riktig.
Kan du ikke ha en mekanisme som sjekker om sessionverdien er null eller ikke?
http://dinside.no/download.php?file=dinfil.txt

Og noe ala http://www.finalwebsites.com/forums/...-file-download utføres hvis sessionid ikke er null.
Du kan jo hele tiden kjøre if-setninger som sjekker om en session-variabel er satt. Om session-variablen ikke er satt blir brukeren redirected til en login-side.

Da forhindrer du at besøkende får tilgang til noe de ikke skal.
852
852's Avatar
Trådstarter
Jeg er usikker på om du forstod meg.

Når jeg laster opp en fil til serveren, kan andre folk få tilgang til filen ved å gå direkte til linke f.eks minside.no/filer/fil1.png. Dette er noe jeg vil hindre. Jeg vil at brukeren skal få tilgang hvis og bare hvis personen er innlogget....
Slik løser jeg det:

Kode

<?php
class Download extends App_Controller {
	
	private $root;
	
	public function Download() {
		
		parent::init(true);
		
		// Set root
		$this->root = $this->config->getProperty('documents', 'system');
	}
	
	public function main() {
		
		$filename = isset($_GET['filename']) ? $_GET['filename'] : false;
		
		if ( !$filename ) die('Ingen fil valgt');
		if ( !file_exists($this->root . $filename) ) die('Den valgte filen finnes ikke i filarkivet');
		
		header("Content-type: application/octet-stream");
		header("Content-Disposition: attachment; filename=" . basename($filename));
		
		readfile($this->root . $filename);
	}
	
	public function file() {
		return $this->main();
	}
}
Du trenger selfølgelig ikke å styre med klasser om du ikke skjønner opplegget, men prinsipper er det samme. Først sjekker du om bruker er pålogget (det gjør jeg i konstruktøren via init-metoden), så henter du filnavn via GET-parameteret før du leser av filen. Med riktige headere vil nettleseren starte nedlastning av filen.

Slik tenker jeg:

Kode

if session:
	file = GET[filename];
	header( … );
	readfile(file);
else:
	die('ikke logget inn');
Edit: For ekstra sikkerhet kan du legge alle filene utenfor root. Da kan ingen uvedkommende laste de ned selvom de kjenner til url-en.
Sist endret av ma10as; 12. januar 2012 kl. 18:19.
852
852's Avatar
Trådstarter
Mange takk ma10as.

Jeg forstår ikke class ennå.
Hvordan gjør jeg dette uten class?

Hvis jeg bruker htaccess til å hindre direkte tilgang til filer i en eller flere folders, kan jeg da bruke php til å force nedlastingen via headers? Ville ikke det løse problemet?
Denne koden er ikke testet, men bør fungere.

Kode

<?php
// For best sikkerhet bør denne mappen ligge utenfor root.
$root = '../files/';

// Sjekk om bruker er innlogget
if ( isset($_SESSION['user']) /*&& $login->isValid()*/ ) {

	$filename = isset($_GET['filename']) ? preg_replace("/[^a-z0-9._-]/i", '', $_GET['filename']) : false;
	
	if ( !$filename ) die('Ingen fil valgt');
	if ( !file_exists($root . $filename) ) die('Den valgte filen finnes ikke i filarkivet');
	
	header("Content-type: application/octet-stream");
	header("Content-Disposition: attachment; filename=" . basename($filename));
	
	readfile($root . $filename);
}
?>
For å leste ned en fil legger du til f. eks ?filename=fil.docx etter filnavnet. F. eks download.php?filename=fil.docx. Du må også endre if-spørringen for å sjekke om bruker er innlogget. Jeg vet ikke hvordan ditt system er bygget opp

Sitat av 852 Vis innlegg
Hvis jeg bruker htaccess til å hindre direkte tilgang til filer i en eller flere folders, kan jeg da bruke php til å force nedlastingen via headers? Ville ikke det løse problemet?
Vis hele sitatet...

Kode

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($filename));
.. vil tvinge en nedlastning, ja.
Sist endret av ma10as; 12. januar 2012 kl. 18:31.
Poenget er at fysiske filen ligger i en database, eller filområde som du ikke tilgang til via http.
PHP henter ut fila til deg med mime-type o.l.
852
852's Avatar
Trådstarter
Dere er fantastiske.
Men jeg har fortsatt et par spørsmål. Det du har skrevet ma10as, det er rett og slett en side, hvor du skriver inn hvilken fil du vil laste ned via GET. ingen problem, du tvinger nedlastingen deretter over php hvis session eksisterer -helt ok. Lenkene kan lastes ned over databasen så helt greit MEEEEEN.

la oss si jeg har denne filen root/files/bilde.png
Hvis en person klikker inn dette i nettleseren root/files/bilde.png får uvedkommende direkte tilgang til filen jo?
Jepp, det er derfor du kan legge filene utenfor root på serveren. Mange hosts har en mappe som heter www, der du skal legge alle filene dine. Om du derimot oppretter en ny mappe på samme nivå (ikke inni www) så kan du lese/skrive til denne mappen via PHP. Uvedkommende vil ikke få tilgang til denne mappen. Noen hosts har også en mappe som heter private på root-nivå. Denne kan også benyttes.