ZabezpečenÍ uploudovaných soborů
- Marek Bartoš
- Nette Blogger | 1274
Jsou dvě varianty. Buď vygeneruješ cestu, která se nedá uhodnout a necháš soubory ve veřejné složce a pro získání souboru bude stačit znalost url, nebo soubory uložíš někde, kde k nim nebude mít uživatel přístup a budeš je posílat přes php. Pokud soubor uložíš na disku do neveřejné složky, tak ti pomůže webserver. Stačí odeslat hlavičku, ukončit běh aplikace a webserver už se o odeslání souboru postará sám. Nginx má X-Accel, Apache X-Sendfile
- karel.nev
- Člen | 21
@Mabar Děkuji za informace. Pokud to dobře chápu, můžu tedy vytvořit složku např. www/soubory a ní mít htaccess s daty viz níže? A k souborům poté přistupovat v aplikaci přes header()?
<?php
header('Content-Type: '.$file->mime);
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: inline; filename=".$filename.");
readfile($file_url);
exit;
?>
<Files .htaccess>
Order deny
Deny from all
</Files>
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
- Marek Bartoš
- Nette Blogger | 1274
Ideálně mít soubory mimo www, v té mít opravdu jen public data, pro zjednodušení.
Celé to funguje tak, že ti přijde request na soubor /images/example.png, ten se bude hledat v rootu webu, tedy /www/images/example.png. Webserver request na neexistující soubor nasměruje na index.php, kde spouštíš nette aplikaci. Pomocí routy požadavek na soubor pošleš na presenter. Ten podle jména souboru najde jeho neveřejně uloženou alternativu, v hlavičce odešle reálné umístění souboru a ukončí běh appky. O zbytek se už postará webserver.
Editoval Mabar (18. 9. 2019 18:24)
- ic
- Člen | 430
kdysi jsem podobnou věc řešit na úrovni webserveru nginx pomocí návodu přímo od ngixu na https://www.nginx.com/…-nginx-plus/
soubory jsou nepřístupné, pokud k nim není přiřazen správný hash a
expirace … ?md5=AUEnXC7T-Tfv9WLsWbf-mw&expires=1483228740
a
tím že se nemusí statické soubory hnát přes nette aplikaci se ušetří
i nějaký ten kus výkonu.