Fotogalerie a zabezpečení adresáře s fotkama

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TheNEoo
Člen | 75
+
0
-

Ahoj všem,
chtěl bych se zeptat, jakým zpusobem zabezpečit adresář s fotkama uživatelů, aby nešly zobrazit na webu přes zadanou url, ale jen čistě dotyčnému, kterému jsou určeny.

Na googlu se mi nedaří najít téma, které by mě poslalo správným směrem.

Řešení přes htaccess má jeden nešvar, a to že se fotky nezobrazí. Je mi jasné že do nich systém může, ale dotyčnej majitel uz je nezobrazí.

přes .htaccess

Order Allow,Deny
Deny from all

adresarova struktura je:
– fotogalerie
--- Id uživatele
---- Id fotky . koncovka

takže url localhost/fotogalerie/10/1.jpg tohle když dám do prohlížeče, tak to zobrazí, což je nežádoucí.

napadlo mě (i jsem četl) fotce vygenerovat nějaky nemysl, kterej uživatel přes url netrefí

třeba jméno fotky udělat id fotky – id uzivatele . koncovka

vadí mi ale na tom, že je to stále pres url dostupné.

přes .htaccess jak ho mám to samozřejmě nezobrazuje fotky uživatelům.

Děkuji za případnou spolupráci :-).

David Matějka
Moderator | 6445
+
0
-

no id fotky – id uzivatele.koncovka zrovna bezpecny neni, to bys musel vygenerovat nejakej nahodnej nazev. pokud to ale nemuzes (nechces) mit viditelne z webu, nezbyde ti jine reseni, nez to poslat pres php (nette) a soubor precist z neverejneho umisteni a vratit uzivateli

edit: pokud to ale nejsou zadna kriticka data, tak bych se asi spokojil s tim nahodnym nazvem

Editoval matej21 (20. 8. 2013 23:06)

besanek
Člen | 128
+
0
-

Dát obrázky do z webu nepřístupné složky, ověřit jestli má přístup a odeslat přes Nette\Application\Responses\FileResponse

TheNEoo
Člen | 75
+
0
-

Typuji, že jste měli na mysli nastavit hlavičku, a obrázek poslat do prohlížeče. Pokud ano, tak stejnou práci myslím odvede Nette\Image

public function getImage(){
$images = Image::fromFile($this->context->params['wwwDir'].'/fotogalerie/11/1.png');
return $images->send(image::PNG);
}

Toto neudělá ale to, co potřebuji. Obrázek se pošle, je ale v prohlížeči přes celou stránku (i s nejakým pozadím), což je nejspíše správně.

Spíš bych potřeboval nejaký takový výsledek (přehled fotek ve fotogalerii);

public function renderDefault(){
$this->template->fotogalerie = //dotaz do DB
}
{foreach $fotogalerie as $data}
<img src="$data->patch">
{/foreach}

Výsledek je asi jasný.

Edit: Napadlo mě když se lze dostat do fotek přes url, tak si url kontrolovat a když se bude v url nacházet /fotogalerie/, tak dotyčného přesměrovat pryč.

používám tento tvar url. např: localhost/front.fotogalerie/edit/1
všude v url mam front.presenter/akce/id

Editoval TheNEoo (21. 8. 2013 10:31)

besanek
Člen | 128
+
0
-

Ano. Výše uvedený obrázek pouze odešle obrázek do prohlížeče. Pro začátek bude stačit vyčlenit tento kód do nějaké akce presenteru.

Nástřel:

public function actionImage($galeryID, $imageID){
	$path = $this->context->params['wwwDir'].'/fotogalerie/'.$galeryID.'/'.$imageID.'.png';
	/*
		Ověření přístupu
	*/
	$response = new \Nette\Application\Responses\FileResponse($path);
	$this->sendResponse($response);
}

A pak lze v šabloně použít něco jako

<img src="{link image, $galeryID, $imageID}">

Je důležité, aby složka fotogalerie nebyla přístupná z webu! Nejlépe vyhodit úplně ze složky www třeba do složky data. V opačném případě je celé tohle snažení k ničemu.

Editoval besanek (21. 8. 2013 14:41)

TheNEoo
Člen | 75
+
0
-

Zde je drobnej překlep, který mi dal malinko zabrat :-)

$this->sendReponse($response);

Api to práskla naštěstí, ale než mi to došlo :-)

$this->sendResponse($response); // chybelo s :-)

Jinak děkuji za nástřel, perfektní. Já pořád řešil, jak dostat fotku do tagu img. Přes akci presenteru jsem neměl vubec šajn, že to takto jde.