Autor Zpráva
francimor
Profil *
Poprosím zkušenější o konzultaci. Řeším jednoduché cloudové úložiště do kterého si budou přihlášení uživatelé nahrávat vlastní soubory (max 100mb) přes webový formulář. Moje představa je, že budu uploadovat pomocí $_FILES, kontrolovat koncovku a MIME typ; soubory se budou ukládat do složky která bude mít zakázané spouštění skriptů pomocí direktivy "php_flag engine off". Každý uživatel bude moci svoje soubory uploadovat, stahovat, mazat, přejmenovávat.

Počítám s tím, že každý uživatel bude mít vlastní složku do které se budou ukládat jeho soubory. Nebo by bylo vhodnější ukládat všechny soubory všech uživatelů do jedné složky a definovat práva přístupu k nim pomocí databáze?

Potřebuju, aby soubory mohli stahovat pouze přihlášení oprávnění uživatelé a aby k nim nebyl žádný přístup zvenčí. Vygooglil jsem, že toto lze vyřešit tak, že direktivou "deny from all" zakážu přístup k souborům ve složce a následně budu stahovat soubory pomocí php nějak takto:

<?php
session_start();
if($_SESSION['login']===1 && $_COOKIE['login']===1){

$file_dir = "/some/dir/";
$file = $file_dir . 'foo.bar';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
} else {
    echo "You need to login to download this file.";
}
?>
(nemám otestováno)
Vzhledem k tomu, že se bude jednat i o docela velké soubory tak z tohoto řešení nejsem nijak nadšen.

Rád bych znal názory a tipy jak z pohledu "architektury", tak z pohledu zabezpečení. Díky.
Alphard
Profil
francimor:
nahrávat vlastní soubory (max 100mb) přes webový formulář
Ideální je mít nějaké pokročilejší řešení s uživatelským progress barem, které třeba na pozadí uploaduje po částech a dokáže při výpadku spojení nějakou část odeslat znovu.

kontrolovat koncovku a MIME typ
To je docela k ničemu asi.

soubory se budou ukládat do složky která bude mít zakázané spouštění skriptů pomocí direktivy "php_flag engine off"
že direktivou "deny from all" zakážu přístup
To v každém případě.

přejmenovávat
Pozor na diakritiku a další bordel v názvech, možná bych raději udržoval seznam souborů i v databázi a soubor samotný pojmenoval nějakým id. Originální název se dá do db.

Nebo by bylo vhodnější ukládat všechny soubory všech uživatelů do jedné složky
Ne, není dobré mít příliš velký počet souborů v adresáři. Ale pokud budou pojmenované podle id, je možné dynamické vytvářet adresářovou strukturu.

že se bude jednat i o docela velké soubory tak z tohoto řešení nejsem nijak nadšen
Některé servery umožňují na základě hlavičky poslat na výstup jinak nepřístupný soubor. Potom PHP jenom ověří oprávnění, předá header a nemusí se přes něj tahat celý objem dat.
francimor
Profil *
Tak jsem to zrealizoval a vše, zdá se, pracuje celkem uspokojivě. Ještě ale řeším jeden problém. Stahování souborů řeším tak, že mám extra skript download.php, do kterého pomocí GET pošlu id souboru, ověřím práva a skriptem, který jsem uvedl v prvním postu vynutím stažení.
Rád bych ale měl možnost například u obrázků nebo pdf tupě nestahovat, ale pouze zobrazit v prohlížeči - nevíte jak na to?
Keeehi
Profil
Vynecháš Content-Description a nastavíš správný Content-Type (případně ho vynecháš, prohlížeč to asi uhodne).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: