Csatlakozz a Slack chatre
Szalai Barna / 2 éve

Letölthető fájlok elrejtése

Az alábbi rövid how-to cikkben bemutatom egy megvalósítását annak, hogyan jelenítsünk meg letölthető fájlokat (pl. doc, pdf) úgy, hogy azok elérési útvonalai, nevei rejtve maradjanak.

Alapvetően kezdőként mi jut eszünkbe ha ilyen feladatot kapunk? Van egy Id-ja a fájlnak az adatbázisban, ahol tároljuk a nevét. Ugyan ez lehetséges a fájl névvel, ha seo barát módra alakítjuk. De mi a gond ezekkel a megoldásokkal?
Ha simán az Id-t adjuk meg egy linkben, akkor bármikor átírva ezt az azonosítót, egy másik fájlt tud letölteni az illető.

Letöltés

Ugyan ez a helyzet a fájlnévvel, meg lehet saccolni bizonyos esetekben, hogy mi a név. Konkrét példa, több cég van regisztrálva egy rendszerbe, akiknek feltöltenek szerződéseket, mindenkinek ugyan abban a témában. Gondoljuk, hogy meg lehessen különböztetni egymástól, hozzácsapjuk a cég ID-ját a fájlnévhez. Tehát:

ÁSZF letöltése

Ahol, megintcsak a trükkös felhasználó végigpróbálva az azonosítókat 1-től kezdve letölthetné más cég dokumetumait, amihez semmi köze, ez a megoldás is problémákat vet fel.

Egy egyszerű megoldás, a hash érték használata ID és fájlnév helyett, a letöltéseknél.

Először is kell egy tábla, amelyben a fájlok adatait tároljuk, ez valószínűleg már megvan mindenkinek. Lehet több minden van ebben a táblában, de a fontos a mi szempontunkból a fájl neve (filename), és pl. egy hash nevű mező, ami legyen 32 karakter hosszú varchar.

A hash mezőben egy generált betű-szám sztringet fogunk tárolni, amelyet a fájl feltöltése után, a fájlnév mentésével egyidőben rögzítünk. Azt, hogy a hash-t hogyan generálod, rád van bízva, én a következő megoldást használtam:

$hash = md5($filename.microtime(true))

Tehát amikor anchor linket készítünk a fájlhoz, akkor hozzáadjuk a $hash változó értékét a címhez, pl.:

fajlnev.doc

Amiből lesz:

fajlnev.doc

Minden egyes fáljnévnek más hash értéke lesz, még akkor is ha megengedett, hogy lehessen egyforma fájlnév a rendszerben.

Készítesz egy route-ot ehhez a linkhez, ami a letöltés metódusra mutat:

public function download($hash)
{
        $doc = $this->document->where('hash', $hash)->first();

        if ( ! $doc) {            
            return redirect()->route('documents')->with('merror', 'Nincs ilyen dokumentum!');                
        } else {            
            return response()->download(base_path().'/feltoltesek/dokumentumok/'.$doc->filename);    
        }      
                        
}

A hash alapján megkeressük azt a rekordot, amely a hozzá tartozó fájlnevet tartalmazza, és a download response visszaadásával letöltjük a valós fájlt, így egy többfelhasználós rendszerben az egyik felhasználó/cég nem tudja véletlen sem letölteni a másik dokumentumát.

 Vissza a cikkekhez