Diskuze: Unlink pomocí URL

PHP PHP Unlink pomocí URL American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Ahoj.
Chci pomocí url třeba takovéto: domena.cz/foto­galerie/4/sma­zat/foto/RTP/___17­.png vymazat soubor ___17.png.

Používám MVC framework.

Obsluhuji to tímto kouskem kodu:

if (!empty($parametry[1]) && $parametry[1] == 'smazat')
                    {
                        $fileToDelete='./foto/'.$parametry[3].'/'.$parametry[4];

                        if(is_file($fileToDelete))
                        {
                            unlink($fileToDelete);
                        $spravceObrazku->odstranObrazek($parametry[0]);
                         $this->pridejZpravu('Soubor byl vymazán.');
                    $this->presmeruj('fotogalerie');}
                    else
    print_r($fileToDelete);
                        }

Když to zadávám s příponou .png tak to hodí chybu, jelikož se nezavolá patrně kontroler ale načítá to prostě ten soubor, kterej je ve složce foto a RTP a ne ve složce fotografie, 4, smazat, foto a RTP.. Když oddělám příponu a odešlu adresu, tak mi to vypíše pouze print_r z větve else, jelikož se nejedná o soubor.

Nějaké nápady?
Napadlo mě pouze upravit to tak, že do db se nebude ukládat přípona a všude bude na tvrdo zadáno jpg, jelikož se jedná o web, na kterém nečekám, že se bude nahrávat něco jiného. Ale občas tam asi budou chtít dát jpg, někdy png, takže pevnou příponou nechci riskovat.. Neexistuje i na tohle nějaká šikovná vychytávka? :)

Díky!

 
Odpovědět 3. května 23:04
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Michal Kuba
Jindřich Máca:

Ahoj,

nápadu bych pár měl, ale nejdřív menší komentář k tomu problému i ke kódu obecně. Nejprve tedy ten problém:

  1. MVC framework, pokud vím, obsahuje nějaký .htaccess, který určuje, jak se má pracovat s obrázky apod. Proto se při zadání té URL obrázek zobrazí a vůbec se nespouští PHP. Takže první možnost je upravit tento soubor.
  2. Když odebereš příponu, tak sice najedeš do PHP a splníš parametrický dotaz, ale takový soubor, tam logicky neexistuje, protože součástí názvu souboru je i jeho přípona. Nacpat tam příponu natvrdo pak rozhodně není dobrý nápad, ale dá se například prohledat složka vůči seznamu podporovaných přípon. Pak se ale omezuješ, že bude existovat soubor s takovým názvem jenom s jednou příponou tj. nemůžeš mít zároveň ___17.png i ___17.jpg. Takže tohle obecně není dobré řešení, pokud tam nepočítáš s pouze určitými typy souborů.

Tak a teď k tomu kódu:

  1. Nechat uživatele libovolně mazat soubory podle zadané URL??? To ses snad zbláznil ne? I když to máš ošetřené do složky foto/, tak přeci kdokoliv může rozpoznat pattern pro název obrázků a pak tam poslat požadavky na smazání úplně všech fotek. Nebo, co když zadám jako název složky ".."? To jsem pak rázem u souborů webu a mažu to komplet všechno... Nemluvě o dalších různých druzích útoků právě přes URL parametry. Toto rozhodně považuji za bezpečností hrozbu, ale pokud to chceš i tak použít, tak si velice dobře zkontroluj, jak zachází s parametry daný framework a možná i přes to, jen pro jistotu, znovu ošetři ty vstupní parametry přímo na místě a úplně nejlépe, tam zaveď nějakou autorizaci, pokud jim tam nemáš.

No a teď nějaké to optimální řešení. Asi bych Ti doporučil nastudovat si a vystavit tam nějaké REST API. Tam se pak může použít např. přímo HTTP metoda DELETE místo aktuálního GET, rovnou tam můžeš zavést i tu autorizaci třeba pomocí tokenu a navíc Ti to dá jasnější formát, jak přistupovat k těm datům. A jako bonus to API pak můžeš použít i pro AJAX požadavky. No a tady už Tě asi odkážu na dokumentaci např. přímo tady na síti - http://www.itnetwork.cz/…ce-rest-api/, případně obecnější informace najdeš na tetičce Wikipedii - https://en.wikipedia.org/…ate_transfer a odtud můžeš pokračovat dál. :)

Doufám, že jsem se vyjádřil srozumitelně a moc jsem Tě nezmátl. Když tak se samozřejmě ještě ptej. ;)

 
Nahoru Odpovědět  +2 4. května 0:01
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Jindřich Máca
Michal Kuba:

Zkusím to napřed přes ten .htaccess, pak kdyžtak Api.. Jen k té bezpečnosti. Celé to je RS pro jeden web, kam bude mít přístup pár lidí, navíc nahoře v kodu je kontrola uživatele, tudíž člověk, co není přihlášen nebude ani připuštěn k provedení mazání a přesměruje ho to na přihlášení :) (tam se nedá registrovat, není to RS pro volné registrace náhodných lidí).

Samozřejmě ani ošetření toho mazání ještě není komplet.. teprve to testuji, až to bude fungovat, přidám tam další kontroly, vždycky se ale jako základ snažím rozběhnout základní úkony a potom na to nabalit další kontroly, protože když něco nefunguje, tak je toho rázem víc na zkoumání ;)

 
Nahoru Odpovědět  +1 4. května 9:08
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Jindřich Máca
Michal Kuba:

Napadla mě taková varianta jak to "obechcat", zajímá mě spíš, jestli to není špatný kvůli nějaký štábní kultuře nebo tak --> prohodil jsem parametry tak, že při mazání se zavolá URL: domena.cz/foto­galerie/4/foto/RTP/___17­.png/smazat

V kontroleru jen změním číslo parametru, který je smazat.

Celou logiku ukládání souborů mám pořešenou tak, že pokud není zadána žádná složka, tak to jde do "hromadné" složky jménem RTP (to ale uživatel nijak nevidí, vidí to jako "žádná složka"), jinak pokud si vytvoří složku pro nějakou danou událost, tak místo parametru za foto/ není RTP ale název složky..

Je to rozumná varianta nebo to je až moc zadrátovaný a není to třeba i bezpečný?

 
Nahoru Odpovědět 4. května 22:47
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Michal Kuba
Jindřich Máca:

Je to rozhodně špatně, třeba i kvůli té štábní kultuře. Ostatně když něco "obechcáváš", tak už to značí, že to není úplně v pořádku. A nebezpeční tam pravděpodobně stále zůstává...

 
Nahoru Odpovědět  +1 6. května 9:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.