Fotogalerie a zabezpečení adresáře s fotkama
- TheNEoo
- Člen | 75
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
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)
- TheNEoo
- Člen | 75
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
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
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.